JSON利用superobject进行资料交换及重新封装ClientDataSet
2016-07-08 01:17
726 查看
先下载superobject http://code.google.com/p/superobject/downloads/list
001.
unit uJSONDB;
002.
003.
interface
004.
uses
005.
SysUtils,Classes,Variants,DB,DBClient,SuperObject,Dialogs;
006.
type
007.
TJSONDB =
class
008.
009.
private
010.
class
function
getJsonFieldNames(res: ISuperObject):TStringList ;
011.
class
function
getJsonFieldValues(res: ISuperObject):TStringList ;
012.
public
013.
class
procedure JsonToClientDataSet(jsonArr: TSuperArray;dstCDS: TClientDataSet);
014.
class
function
ClientDataSetToJSON(srcCDS: TClientDataSet):UTF8String;
015.
end;
016.
017.
implementation
018.
019.
function
GetToken(
var
astring: string;
const
fmt:array of
char
): string;
020.
var
021.
i,j:integer;
022.
Found:Boolean;
023.
begin
024.
found:=
false
;
025.
result:=
''
;
026.
aString := TrimLeft(aString);
027.
028.
if
length(astring)=0 then exit;
029.
030.
I:=1;
031.
while
I<=length(Astring)
do
032.
begin
033.
found:=
false
;
034.
if
aString[i]<=
#128 then
035.
begin
036.
for
j:=Low(Fmt) to High(Fmt)
do
037.
begin
038.
if
(astring[i]<>Fmt[j]) then
continue
;
039.
found:=
true
;
040.
break
;
041.
end;
042.
16456
if
Not found thenI:=I+1;
043.
end
044.
else
I:=I+2;
045.
046.
if
found then
break
;
047.
end;
048.
049.
if
found then
050.
begin
051.
result:=copy(astring,1,i-1);
052.
delete
(astring,1,i);
053.
end
054.
else
055.
begin
056.
result:=astring;
057.
astring:=
''
;
058.
end;
059.
end;
060.
061.
function
GetFieldParams(PropName,Source:string): string;
062.
var
063.
S1,S2: string;
064.
TmpParam: string;
065.
AChar: string;
066.
aValue,aPropName,aSource: string;
067.
begin
068.
Result:=
''
;
069.
if
Source=
''
then Exit;
070.
aSource := Source;
071.
while
aSource <>
''
do
072.
begin
073.
aValue := GetToken(aSource,[
','
]);
074.
aPropName := GetToken(aValue,[
':'
]);
075.
if
CompareText(PropName,aPropName) <>0 then
continue
;
076.
Result := aValue;
077.
break
;
078.
end;
079.
end;
080.
//从json取得字段名称
081.
class
function
TJSONDB.getJsonFieldNames(res: ISuperObject):TStringList ;
082.
var
083.
i: Integer;
084.
fieldList : TStringList;
085.
fieldNames :String;
086.
begin
087.
try
088.
fieldList := TStringList.Create;
089.
fieldNames := res.AsObject.getNames.AsString;
090.
fieldNames := StringReplace(fieldNames,
'['
,
''
,[rfReplaceAll,rfIgnoreCase]);
091.
fieldNames := StringReplace(fieldNames,
']'
,
''
,[rfReplaceAll,rfIgnoreCase]);
092.
fieldNames := StringReplace(fieldNames,
'"'
,
''
,[rfReplaceAll,rfIgnoreCase]);
093.
094.
fieldList.Delimiter :=
','
;
095.
fieldList.DelimitedText := fieldNames;
096.
Result:= fieldList;
097.
finally
098.
//fieldList.Free;
099.
end;
100.
end;
101.
102.
//从json取得字段值
103.
class
function
TJSONDB.getJsonFieldValues(res: ISuperObject):TStringList ;
104.
var
105.
i: Integer;
106.
fieldList : TStringList;
107.
fieldValues :String;
108.
begin
109.
try
110.
fieldList := TStringList.Create;
111.
fieldValues := res.AsObject.getValues.AsString;
112.
fieldValues := StringReplace(fieldValues,
'['
,
''
,[rfReplaceAll,rfIgnoreCase]);
113.
fieldValues := StringReplace(fieldValues,
']'
,
''
,[rfReplaceAll,rfIgnoreCase]);
114.
fieldValues := StringReplace(fieldValues,
'"'
,
''
,[rfReplaceAll,rfIgnoreCase]);
115.
116.
fieldList.Delimiter :=
','
;
117.
fieldList.DelimitedText := fieldValues;
118.
Result:= fieldList;
119.
finally
120.
//fieldList.Free;
121.
end;
122.
end;
123.
//json转CDS
124.
class
procedure TJSONDB.JsonToClientDataSet(jsonArr: TSuperArray;dstCDS: TClientDataSet);
125.
var
126.
fieldList: TStringList;
127.
valuesList: TStringList;
128.
jsonSrc: string;
129.
i,j: Integer;
130.
begin
131.
132.
fieldList:= getJsonFieldNames(SO[jsonArr[0].AsJson(False,False)]);
133.
if
(dstCDS.FieldCount = 0) then
134.
begin
135.
for
i := 0 to fieldList.Count -1
do
136.
begin
137.
dstCDS.FieldDefs.Add(fieldList[i],ftString,100,False);
138.
end;
139.
dstCDS.CreateDataSet;
140.
dstCDS.Close;
141.
dstCDS.Open;
142.
end;
143.
try
144.
dstCDS.DisableControls;
145.
for
i := 0 to jsonArr.Length -1
do
146.
begin
147.
jsonSrc:= SO[jsonArr[i].AsJson(False,False)].AsString;
148.
jsonSrc := StringReplace(jsonSrc,
'['
,
''
,[rfReplaceAll,rfIgnoreCase]);
149.
jsonSrc := StringReplace(jsonSrc,
']'
,
''
,[rfReplaceAll,rfIgnoreCase]);
150.
jsonSrc := StringReplace(jsonSrc,
'"'
,
''
,[rfReplaceAll,rfIgnoreCase]);
151.
jsonSrc := StringReplace(jsonSrc,
'{'
,
''
,[rfReplaceAll,rfIgnoreCase]);
152.
jsonSrc := StringReplace(jsonSrc,
'}'
,
''
,[rfReplaceAll,rfIgnoreCase]);
153.
dstCDS.Append;
154.
for
j:= 0 to fieldList.Count -1
do
155.
begin
156.
dstCDS.FieldByName(fieldList[j]).AsString:= GetFieldParams(fieldList[j],jsonSrc);
157.
end;
158.
dstCDS.Post;
159.
end;
160.
161.
finally
162.
dstCDS.EnableControls;
163.
end;
164.
end;
165.
166.
class
function
TJSONDB.ClientDataSetToJSON(srcCDS: TClientDataSet): UTF8String;
167.
var
168.
i,j: Integer;
169.
keyValue:String;
170.
jsonList:TStringList;
171.
jsonResult:String;
172.
begin
173.
if
not srcCDS.Active then srcCDS.Open;
174.
175.
try
176.
jsonList := TStringList.Create;
177.
srcCDS.DisableControls;
178.
srcCDS.First;
179.
while
not srcCDS.Eof
do
180.
begin
181.
keyValue:=
''
;
182.
for
i := 0 to srcCDS.FieldDefs.Count -1
do
183.
begin
184.
keyValue:= keyValue + Format(
'"%s":"%s",'
,[srcCDS.Fields[i].FieldName,
srcCDS.Fields[i].AsString]);
185.
186.
end;
187.
jsonList.Add(Format(
'{%s}'
,[Copy(keyValue,
0,Length(keyValue)-1)]));
188.
srcCDS.Next;
189.
end;
190.
for
i := 0 to jsonList.Count -1
do
191.
begin
192.
jsonResult := jsonResult + jsonList[i] +
','
;
193.
end;
194.
Result:= Utf8Encode(Format(
'[%s]'
,
[Copy(jsonResult,0,Length(jsonResult)-1)]));
195.
finally
196.
srcCDS.EnableControls;
197.
jsonList.Free;
198.
end;
199.
end;
200.
201.
202.
203.
end.
使用范例[/code]01.[code]//取得资料 www.it165.net
02.
procedure TForm1.btnRefreshClick(Sender: TObject);
03.
var
04.
getString:string;
05.
json: ISuperObject;
06.
ja: TSuperArray;
07.
begin
08.
try
09.
getString := idhtp1.Get(
'http://localhost/xuan/wsLine.php'
);
10.
json :=SO(getString);
11.
ja := json.AsArray;
12.
13.
TJSONDB.JsonToClientDataSet(ja,cdsMain);
14.
finally
15.
16.
end;
17.
end;
18.
//写入资料
19.
procedure TForm1.btnSubmitClick(Sender: TObject);
20.
var
21.
jsonString:string;
22.
jsonStream:TStringStream;
23.
begin
24.
if
cdsNew.State
in
[dsEdit] then cdsNew.Post;
25.
try
26.
jsonString:= TJSONDB.ClientDataSetToJSON(cdsNew);
27.
28.
jsonStream := TStringStream.Create(jsonString);
29.
30.
idhtp1.HandleRedirects := True;
31.
idhtp1.ReadTimeout := 5000;
32.
idhtp1.Request.ContentType :=
'application/json'
;
33.
idhtp1.Post(
'http://localhost/xuan/wsLine.php?action=insert'
,jsonStream);
34.
35.
finally
36.
jsonStream.Free;
37.
end;
38.
end;
JSON格式参考
[{"id":"0987336122","name":"\u738b\u5c0f\u660e","content":"","misc_type":"Jpeg","misc":null,"msg_date":"2012-10-09 11:18:38"},
{"id":"0987336122","name":"\u674e\u5c0f\u83ef","content":"","misc_type":"Jpeg","misc":null,"msg_date":"2012-10-09 11:18:45"}]
相关文章推荐
- 全面解析Objective-C中的block代码块的使用
- 不变对象(Immutable Objects)
- 【数据库】sql server中的sys.sysobjects系统表
- Objective-C的hook方案(一): Method Swizzling
- Objective-C的hook方案(一): Method Swizzling
- Objective-C——类的本质
- java基础学习总结——Object类
- Objective-C——Block的使用
- iOS学习(十四)Objective-C 继承
- Object-c和Java中的代理
- iOS学习(十三)Objective-C 常见的内存错误
- iOS学习(十二)Objective-C 引用计数器和存取器
- Android异常--Parcelable encountered IOException writing serializable object
- 李洪强iOS开发之【Objective-C】08-self关键字
- String转Json,数据格式没问题,始终报String cannot be converted to JSONObject的解决办法
- Object和Function
- objective-C 编程全解-第15章 消息发送模式 下 NSUndoManager 撤销管理器
- objective-C 编程全解-第15章 消息发送模式 中
- Objective-C 编程全解-第15章 消息发送模式 上
- 判断字符串解析是JsonObject或者JsonArray