虽有将Clientdataset转换到JSON的经验,谢谢

解决方案 »

  1.   

    这还不简单吗?
    搞个循环,不就玩了?
    var
      Json: TlkJSONobject;
      ChildJson: TlkJSONobject;
      i: integer;
    begin
      Json := TlkJSONobject.Create;
      ClientDataSet1.First;
      while not ClientDataSet1.Eof do
      begin
         ChildJson := TlkJSONobject.Create;
         for i := 0 to ClientDataSet1.FieldCount - 1 do
            ChildJson.Add(ClientDataSet1.Fields[i].FieldName,ClientDataSet1.Fields[i].AsString);
         Json.Add(IntToStr(Json.Count),ChildJson);
         ClientDataSet1.Next;
      end;
      TlkJSONstreamed.SaveToFile(Json,'C:\1.txt');
      Json.Free;
      

  2.   

    谢谢回复,有两个问题:1、我需要相互转换
    2、这种效率怎么样呢?
       另外我需要将转换后的结果通过webservice传输到客户端,那么需要怎么序列化json结果?谢谢
      

  3.   

    上面的只是把数据全部都弄成了Json数据!
    没有保存结构,下面我给你两个完整的函数吧?
    procedure ClientDataSetToJson(ClientDataSet: TClientDataSet;JsoFile: String);
    var
      Json: TlkJSONobject;
      ChildJson,FieldJson: TlkJSONobject;
      i: integer;
    begin
      Json := TlkJSONobject.Create;
      FieldJson := TlkJSONobject.Create;
      ClientDataSet.First;
      for i := 0 to ClientDataSet.FieldCount - 1 do
      begin
        ChildJson := TlkJSONobject.Create;
        ChildJson.Add('FieldName',ClientDataSet.Fields[i].FieldName);
        ChildJson.Add('FieldType',Integer(ClientDataSet.Fields[i].DataType));
        ChildJson.Add('FieldSize',ClientDataSet.Fields[i].Size);
        FieldJson.Add(IntToStr(i),ChildJson);
      end;
      Json.Add('TableName',FieldJson);
      while not ClientDataSet.Eof do
      begin
         ChildJson := TlkJSONobject.Create;
         for i := 0 to ClientDataSet.FieldCount - 1 do
            ChildJson.Add(ClientDataSet.Fields[i].FieldName,ClientDataSet.Fields[i].AsString);
         Json.Add(IntToStr(Json.Count),ChildJson);
         ClientDataSet.Next;
      end;
      TlkJSONstreamed.SaveToFile(Json,JsoFile);
      Json.Free;
    end;procedure JsoToClientDataSet(JsoFIle: string;ClientdataSet: TClientDataSet);
    var
      Json: TlkJSONobject;
      ChildJson,FieldJson: TlkJSONobject;
      i,j: integer;
    begin
      Json := TlkJSONstreamed.LoadFromFile(JsoFIle) as TlkJSONobject;
      
      FieldJson := (Json.Field['TableName']) as TlkJSONobject;
      ClientdataSet.Close;
      ClientdataSet.FieldDefs.Clear;
      for i := 0 to FieldJson.Count - 1 do
      begin
          ChildJson := FieldJson.field[inttostr(i)] as TlkJSONobject;
          ClientdataSet.FieldDefs.Add(ChildJson.getString('FieldName'),TFieldType(ChildJson.getInt('FieldType')),ChildJson.getInt('FieldSize'));
      end;
      if ClientdataSet.FieldDefs.Count = 0 then
         Exit;
      ClientdataSet.CreateDataSet;
      for i := 1 to Json.Count - 1 do
      begin
        ChildJson := Json.Field[IntToStr(i)] as TlkJSONobject;
        ClientdataSet.Append;
        for j := 0 to ChildJson.Count - 1 do
        begin
          ClientdataSet.Fields[j].AsString := ChildJson.getString(j)
        end;
        ClientdataSet.Post;
      end;
      Json.Free;
    end;
      

  4.   

    这种方式的效率怎么样,我也不知道!
    因为没有试验过,而且,我也是最近几天才知道原来有JSON这个东西,看到你发的这个问题,我才第一次写了一个关于JSON的例子,呵呵,摸索中。
      

  5.   

    呵呵,共同学习,这种效率可能一般,我现在也是这种循环,
    用的是2009自带的json.pas,
    希望多交流