如题......只是一个单元, 为了测试JSON单元性能的...

具体测试结果参考: http://www.cnblogs.com/lzl_17948876/p/3668052.html

代码中用到的SevenZIP单元在这里: http://www.cnblogs.com/lzl_17948876/p/3876160.html

unit DSCJSON;

//  ***************************************************************************
//
// TDataSet与JSON相互转换单元
//
// 版本: 1.3
// 作者: 刘志林
// 修改日期: 2016-08-17
// QQ: 17948876
// E-mail: lzl_17948876@hotmail.com
// 博客: http://www.cnblogs.com/lzl_17948876/
//
// !!! 若有修改,请通知作者,谢谢合作 !!!
//
// ---------------------------------------------------------------------------
//
// 修改历史:
// 1.3
// 去掉字符编码配置, 去掉二进制编码配置
// 增加对二进制字段压缩的支持(使用7-ZIP)
// 优化了一些代码结构
// 1.2
// 支持QJSON
// 增加SYSTEM.JSON单元支持(D10中新单元, 就是原有的DBXJSON)
// 1.1
// 支持FireDAC
// 增加DBXJSON单元支持
// 增加对NULL值字段支持
// 1.0:
// 支持ADO/ClientDataset与JSON互相转换
// 使用SuperObject单元作为JSON解析单元
//
// ***************************************************************************(* {$DEFINE FIREDAC}
//{$DEFINE ADO} {$DEFINE QJSON}
//{$DEFINE JSON_SO}
//{$DEFINE JSON_DBX}
//{$DEFINE JSON_SYS}
{$IF DEFINED(JSON_DBX) OR DEFINED(JSON_SYS)}
{$DEFINE SYSJSON}
{$ENDIF} //{$DEFINE 7ZIP} interface uses
SysUtils, Classes, DB, DBClient, DateUtils
{$IFDEF JSON_DBX}
, DBXJSON
{$ENDIF}
{$IFDEF JSON_SO}
, superobject, Variants
{$ENDIF}
{$IFDEF FIREDAC}
, FireDAC.Comp.DataSet
{$ENDIF}
{$IFDEF JSON_SYS}
, System.JSON
{$ENDIF}
{$IFDEF QJSON}
, QJSON
{$ENDIF}
{$IFDEF ADO}
, ADODB
{$ENDIF}
, EncdDecd; /// <summary>将数据集转化为JSON数据</summary>
/// <param name="ADataSet">TDataSet - 数据集</param>
/// <param name="AJSON">WideString - 输出转换结果</param>
/// <returns>转换结果 成功: True 失败: False</returns>
function DataSetToJSON(ADataSet: TDataSet; var AJSON: WideString): Boolean; /// <summary>JSON数据转换为结果集</summary>
/// <param name="AJSON">JSON数据</param>
/// <param name="ADataSet">数据集</param>
/// <returns>转换结果 成功: True 失败: False</returns>
function JSONToDataSet(AJSON: WideString; ADataSet: TDataSet): Boolean; implementation {$IFDEF 7ZIP}
uses
SevenZIP;
{$ENDIF} (*
C: 配置表
C.BC BolbComp 二进制字段是否压缩
0:未压缩 1:已压缩
默认 0
C.CC CompClass 压缩类型 {使用7-ZIP压缩, 如果不打开7ZIP编译开关, 此控制无效认为不压缩}
空表示不压缩, 否则为7-ZIP压缩类型
默认 CLSID_CFormatGZip : TGUID = '{23170F69-40C1-278A-1000-000110EF0000}' T: 表结构表
T.N:列名
T.D:显示列名
T.T:列数据类型 Data.DB.TFieldType
T.L:列数据长度
T.R:列值是否允许为空 R: 数据表 {
"C":{"BC":0, "CM":"", "BE":0},
"T":[{"N":"FieldName", "D":"DisplayName", "T":0, "L":100, "R":1}],
"R":[["Field1Value", "Field2Value"]]
} *) const
_FT_STRING = $; {字符}
_FT_INTEGER = $; {整形}
_FT_FLOAT = $; {浮点}
_FT_DATETIME = $; {日期}
_FT_BOOLEAN = $; {布尔}
_FT_BLOB = $; {二进制} _FT_CURRENCY = $; {金额} type
TConfig = record
BolbComp: Boolean; {二进制字段是否压缩}
CompClass: string; {压缩模式 空表示不压缩, 否则为7-ZIP压缩类型}
end; function JSONToDataSet(AJSON: WideString; ADataSet: TDataSet): Boolean;
var
nJDS: {$IFDEF SYSJSON}TJSONObject{$ENDIF}
{$IFDEF JSON_SO}ISuperObject{$ENDIF}
{$IFDEF QJSON}TQJson{$ENDIF}
;
nConfig: TConfig; procedure _JTDConfig;
var
nJO: {$IFDEF SYSJSON}TJSONObject{$ENDIF}
{$IFDEF JSON_SO}ISuperObject{$ENDIF}
{$IFDEF QJSON}TQJson{$ENDIF}
;
begin
with nConfig do
begin
BolbComp := False;
CompClass := '';
end; {$IFDEF SYSJSON}
nJO := nJDS.GetValue('C') as TJSONObject;
if nJO = nil then
Exit;
{$ENDIF}
{$IFDEF JSON_SO}
nJO := nJDS.N['C'];
if nJO.DataType = stNull then
Exit;
{$ENDIF}
{$IFDEF QJSON}
nJO := nJDS.ItemByName('C');
if nJO.DataType = jdtNull then
Exit;
{$ENDIF}
with nConfig do
begin
BolbComp := {$IFDEF SYSJSON}TJSONNumber(nJO.GetValue('BC')).AsInt{$ENDIF}
{$IFDEF JSON_SO}nJO.I['BC']{$ENDIF}
{$IFDEF QJSON}nJO.ItemByName('BC').AsInteger{$ENDIF}
= ;
{$IFDEF 7ZIP}
CompClass := {$IFDEF SYSJSON}nJO.GetValue('CC').Value{$ENDIF}
{$IFDEF JSON_SO}nJO['CC'].AsString{$ENDIF}
{$IFDEF QJSON}nJO.ItemByName('CC').AsString{$ENDIF}
;
{$ELSE}
CompClass := '';
{$ENDIF}
end;
end; function _JTDStepField: Boolean;
var
nFName, nFDisplay: String;
i, nFLength: Integer;
nFType: Byte;
nFD: TFieldDef;
nFRequired: Boolean;
{$IFDEF SYSJSON}
nJA: TJSONArray;
nJO: TJSONObject;
nJV: TJSONValue;
nJP: TJSONPair;
{$ENDIF}
{$IFDEF JSON_SO}
nJA: TSuperArray;
nJO, nJR: ISuperObject;
{$ENDIF}
{$IFDEF QJSON}
nJO, nJR: TQJson;
{$ENDIF}
begin
Result := False;
ADataSet.Close; {$IFDEF SYSJSON}
nJA := nJDS.GetValue('T') as TJSONArray;
if nJA = nil then
Exit;
{$ENDIF}
{$IFDEF JSON_SO}
nJO := nJDS.N['T'];
if nJO.DataType = stNull then
Exit;
{$ENDIF}
{$IFDEF QJSON}
nJO := nJDS.ItemByName('T');
if nJO.DataType = jdtNull then
Exit;
{$ENDIF} ADataSet.FieldDefs.BeginUpdate;
try
ADataSet.FieldDefs.Clear; {拆解Field}
{$IFDEF SYSJSON}
for i := to nJA.Size - do
begin
nJO := nJA.Get(i) as TJSONObject;
nFName := nJO.GetValue('N').Value;
nFDisplay := nJO.GetValue('D').Value;
nFType := TJSONNumber(nJO.GetValue('T')).AsInt;
nFLength := TJSONNumber(nJO.GetValue('L')).AsInt;
nFRequired := Boolean(TJSONNumber(nJO.GetValue('R')).AsInt);
{$ENDIF}
{$IFDEF JSON_SO}
nJA := nJO.AsArray;
for i := to nJA.Length - do
begin
nJR := nJA[i];
nFName := nJR['N'].AsString;
nFDisplay := nJR['D'].AsString;
nFType := nJR['T'].AsInteger;
nFLength := nJR['L'].AsInteger;
nFRequired := Boolean(nJR['R'].AsInteger);
{$ENDIF}
{$IFDEF QJSON}
for i := to nJO.Count - do
begin
nJR := nJO.Items[i];
nFName := nJR.ItemByName('N').AsString;
nFDisplay := nJR.ItemByName('D').AsString;
nFType := nJR.ItemByName('T').AsInteger;
nFLength := nJR.ItemByName('L').AsInteger;
nFRequired := Boolean(nJR.ItemByName('R').AsInteger);
{$ENDIF}
nFD := ADataSet.FieldDefs.AddFieldDef;
with nFD do
try
Name := nFName;
case nFType of
_FT_INTEGER:
DataType := ftLargeint;
_FT_FLOAT:
DataType := ftFloat;
_FT_DATETIME:
DataType := ftDateTime;
_FT_BOOLEAN:
DataType := ftBoolean;
_FT_BLOB:
DataType := ftBlob;
_FT_CURRENCY:
DataType := ftCurrency;
else
DataType := ftString;
Size := nFLength;
end;
Required := nFRequired;
DisplayName := nFDisplay;
except
DisposeOf;
end;
end;
finally
ADataSet.FieldDefs.EndUpdate;
end;
Result := True;
end; function _JTDStepRecord: Boolean;
var
nFName, nStr: String;
i, j: Integer;
nField: TField;
nMSI, nMSO: TMemoryStream;
{$IFDEF 7ZIP}
nCItemIndex: Integer;
nMSC: TMemoryStream; {解压缩用}
{$ENDIF}
nJRA: {$IFDEF SYSJSON}TJSONArray{$ENDIF}
{$IFDEF JSON_SO}TSuperArray{$ENDIF}
{$IFDEF QJSON}TQJson{$ENDIF}
;
{$IFDEF SYSJSON}
nJA: TJSONArray;
{$ENDIF}
{$IFDEF JSON_SO}
nJA: TSuperArray;
nJO, nJR: ISuperObject;
{$ENDIF}
{$IFDEF QJSON}
nJO: TQJson;
{$ENDIF}
begin
Result := False;
{$IFDEF SYSJSON}
nJA := nJDS.GetValue('R') as TJSONArray;
if nJA = nil then
Exit;
{$ENDIF}
{$IFDEF JSON_SO}
nJO := nJDS.N['R'];
if nJO.DataType = stNull then
Exit;
nJA := nJO.AsArray;
{$ENDIF}
{$IFDEF QJSON}
nJO := nJDS.ItemByName('R');
if nJO.DataType = jdtNull then
Exit;
{$ENDIF}
nMSO := TMemoryStream.Create;
nMSI := TStringStream.Create;
{$IFDEF 7ZIP}
nMSC := TMemoryStream.Create;
{$ENDIF}
ADataSet.DisableControls;
try
for i := to {$IFDEF SYSJSON}nJA.Size - {$ENDIF}
{$IFDEF JSON_SO}nJA.Length - {$ENDIF}
{$IFDEF QJSON}nJO.Count - {$ENDIF}
do
begin
nJRA := {$IFDEF SYSJSON}nJA.Get(i) as TJSONArray{$ENDIF}
{$IFDEF JSON_SO}nJA[i].AsArray{$ENDIF}
{$IFDEF QJSON}nJO.Items[i]{$ENDIF}
;
ADataSet.Append;
for j := to ADataSet.Fields.Count - do
begin
nField := ADataSet.Fields[j];
nFName := nField.FieldName;
if
{$IFDEF SYSJSON}nJRA.Get(j).Null{$ENDIF}
{$IFDEF JSON_SO}nJRA[j].DataType = stNull{$ENDIF}
{$IFDEF QJSON}nJRA[j].DataType = jdtNull{$ENDIF}
then
begin
nField.SetData(nil);
end
else
begin
case nField.DataType of
ftLargeint:
begin
nField.Value := {$IFDEF SYSJSON}TJSONNumber(nJRA.Get(j)).AsInt64{$ENDIF}
{$IFDEF JSON_SO}nJRA[j].AsInteger{$ENDIF}
{$IFDEF QJSON}nJRA.Items[j].AsInteger{$ENDIF}
;
end;
ftFloat, ftCurrency:
begin
nField.Value := {$IFDEF SYSJSON}TJSONNumber(nJRA.Get(j)).AsDouble{$ENDIF}
{$IFDEF JSON_SO}nJRA[j].AsDouble{$ENDIF}
{$IFDEF QJSON}nJRA.Items[j].AsFloat{$ENDIF}
;
end;
ftDateTime:
begin
nField.Value := UnixToDateTime(
{$IFDEF SYSJSON}TJSONNumber(nJRA.Get(j)).AsInt64{$ENDIF}
{$IFDEF JSON_SO}nJRA[j].AsInteger{$ENDIF}
{$IFDEF QJSON}nJRA.Items[j].AsInt64{$ENDIF}
);
end;
ftBoolean:
begin
nField.Value := Boolean(
{$IFDEF SYSJSON}TJSONNumber(nJRA.Get(j)).AsInt{$ENDIF}
{$IFDEF JSON_SO}nJRA[j].AsInteger{$ENDIF}
{$IFDEF QJSON}nJRA.Items[j].AsInteger{$ENDIF}
);
end;
ftBlob:
begin
nMSI.Clear;
nMSO.Clear;
nStr := {$IFDEF SYSJSON}TJSONString(nJRA.Get(j)).Value{$ENDIF}
{$IFDEF JSON_SO}nJRA[j].AsString{$ENDIF}
{$IFDEF QJSON}nJRA.Items[j].AsString{$ENDIF}
;
nMSI.Write(nStr[], Length(nStr) * SizeOf(Char));
nMSI.Position := ;
nMSO.Clear;
{$IFDEF 7ZIP}
if nConfig.CompClass = '' then
begin
{$ENDIF}
DecodeStream(nMSI, nMSO);
{$IFDEF 7ZIP}
end
else
try
nMSC.Clear;
DecodeStream(nMSI, nMSC);
nMSC.Position := ;
with CreateInArchive(TGUID.Create(nConfig.CompClass)) do
begin
OpenStream(T7zStream.Create(nMSC, soReference));
for nCItemIndex := to NumberOfItems - do
if not ItemIsFolder[nCItemIndex] then
begin
ExtractItem(nCItemIndex, nMSO, False);
Break;
end;
end;
except
{此处解压缩异常后, 默认不写入数据, 根据实际情况进行处理}
nMSO.Clear;
end;
{$ENDIF}
nMSO.Position := ;
TBlobField(nField).LoadFromStream(nMSO);
end;
else
nField.Value := {$IFDEF SYSJSON}TJSONString(nJRA.Get(j)).Value{$ENDIF}
{$IFDEF JSON_SO}nJRA[j].AsString{$ENDIF}
{$IFDEF QJSON}nJRA.Items[j].AsString{$ENDIF}
;
end;
end;
end;
ADataSet.Post;
end;
ADataSet.First;
finally
ADataSet.EnableControls;
nMSO.Free;
nMSI.Free;
{$IFDEF 7ZIP}
nMSC.Free;
{$ENDIF}
end;
Result := True;
end; begin
if ADataSet = nil then
Exit; {$IFDEF SYSJSON}
nJDS := TJSONObject.ParseJSONValue(AJSON) as TJSONObject;
try
{$ENDIF}
{$IFDEF JSON_SO}
nJDS := SO(AJSON);
{$ENDIF}
{$IFDEF QJSON}
nJDS := TQJson.Create;
nJDS.Parse(AJSON);
try
{$ENDIF}
try
_JTDConfig; if ADataSet is TCustomClientDataSet then
begin
Result := _JTDStepField;
if Result then
begin
TCustomClientDataSet(ADataSet).CreateDataSet;
Result := _JTDStepRecord;
end;
end
{$IFDEF ADO}
else if ADataSet is TADODataSet then
begin
Result := _JTDStepField;
if Result then
begin
TADODataSet(ADataSet).CreateDataSet;
Result := _JTDStepRecord;
end;
end
{$ENDIF}
{$IFDEF FIREDAC}
else if ADataSet is TFDDataSet then
begin
Result := _JTDStepField;
if Result then
begin
TFDDataSet(ADataSet).CreateDataSet;
Result := _JTDStepRecord;
end;
end
{$ENDIF}
else
Result := False;
except
Result := False;
end;
{$IFDEF SYSJSON}
finally
nJDS.Free;
end;
{$ENDIF}
{$IFDEF QJSON}
finally
nJDS.Free;
end;
{$ENDIF}
end; function DataSetToJSON(ADataSet: TDataSet; var AJSON: WideString): Boolean;
var
nJA, nJRA: {$IFDEF SYSJSON}TJSONArray{$ENDIF}
{$IFDEF JSON_SO}TSuperArray{$ENDIF}
{$IFDEF QJSON}TQJson{$ENDIF}
;
nJDS: {$IFDEF SYSJSON}TJSONObject{$ENDIF}
{$IFDEF JSON_SO}ISuperObject{$ENDIF}
{$IFDEF QJSON}TQJson{$ENDIF}
;
{$IFDEF SYSJSON}
nJO: TJSONObject;
{$ENDIF}
{$IFDEF JSON_SO}
nJR: ISuperObject;
{$ENDIF}
i: Integer;
nTitle, nStr, nFDisplay: string;
nField: TField;
nFT: Byte;
nMSI: TMemoryStream;
nSSO: TStringStream;
nCompClassStr: string;
{$IFDEF 7ZIP}
nMSC: TMemoryStream; {解压缩用}
{$ENDIF}
const
_DEF_TITLE = '{"C":{"BC":0,"CC":"%s"},"T":[],"R":[]}';
_DEf_RECORD = '{"N":"%s","D":"%s","T":%d,"L":%d,"R":%d}';
begin
Result := False;
{$IFDEF 7ZIP}
nCompClassStr := CLSID_CFormatGZip.ToString;
{$ELSE}
nCompClassStr := '';
{$ENDIF}
nTitle := Format(_DEF_TITLE, [nCompClassStr]);
{$IFDEF SYSJSON}
nJDS := TJSONObject.ParseJSONValue(nTitle) as TJSONObject;
{$ENDIF}
{$IFDEF JSON_SO}
nJDS := SO(nTitle);
{$ENDIF}
{$IFDEF QJSON}
nJDS := TQJson.Create;
nJDS.Parse(nTitle);
{$ENDIF}
ADataSet.DisableControls;
nMSI := TMemoryStream.Create;
nSSO := TStringStream.Create;
{$IFDEF 7ZIP}
nMSC := TMemoryStream.Create;
{$ENDIF}
try
nJA := {$IFDEF SYSJSON}nJDS.GetValue('T') as TJSONArray{$ENDIF}
{$IFDEF JSON_SO}nJDS.A['T']{$ENDIF}
{$IFDEF QJSON}nJDS.ItemByName('T'){$ENDIF}
;
AJSON := '';
try
ADataSet.First;
for i := to ADataSet.Fields.Count - do
begin
nField := ADataSet.Fields[i];
case nField.DataType of
ftSmallint, ftInteger, ftWord, ftLargeint, ftLongWord, ftShortint, ftByte:
nFT := _FT_INTEGER;
ftFloat, ftBCD, ftSingle, ftExtended:
nFT := _FT_FLOAT;
ftDate, ftTime, ftDateTime:
nFT := _FT_DATETIME;
ftBoolean:
nFT := _FT_BOOLEAN;
ftBlob, ftMemo, ftGraphic:
nFT := _FT_BLOB;
ftCurrency:
nFT := _FT_CURRENCY;
else
nFT := _FT_STRING;
end;
if nField.DisplayLabel = nField.FieldName then
nFDisplay := ''
else
nFDisplay := nField.DisplayLabel;
nStr := Format(_DEf_RECORD, [nField.FieldName, nFDisplay, nFT,
nField.DataSize, Byte(nField.Required)]);
{$IFDEF SYSJSON}
nJA.AddElement(TJSONObject.ParseJSONValue(nStr));
{$ENDIF}
{$IFDEF JSON_SO}
nJA.Add(SO(nStr));
{$ENDIF}
{$IFDEF QJSON}
nJA.Add.Parse(nStr);
{$ENDIF}
end; nJA := {$IFDEF SYSJSON}nJDS.GetValue('R') as TJSONArray{$ENDIF}
{$IFDEF JSON_SO}nJDS.A['R']{$ENDIF}
{$IFDEF QJSON}nJDS.ItemByName('R'){$ENDIF}
;
while not ADataSet.Eof do
begin
{$IFDEF SYSJSON}
nJRA := TJSONArray.Create;
nJA.AddElement(nJRA);
{$ENDIF}
{$IFDEF JSON_SO}
nJR := SA([]);
nJA.Add(nJR);
nJRA := nJR.AsArray;
{$ENDIF}
{$IFDEF QJSON}
nJRA := nJA.Add('', jdtArray);
{$ENDIF}
for i := to ADataSet.Fields.Count - do
begin
nField := ADataSet.Fields[i];
if nField.IsNull then
begin
{$IFDEF SYSJSON}
nJRA.AddElement(TJSONNull.Create);
{$ENDIF}
{$IFDEF JSON_SO}
nJRA.Add(SO(NULL));
{$ENDIF}
{$IFDEF QJSON}
nJRA.Add('', jdtNull);
{$ENDIF}
end
else
begin
case nField.DataType of
ftSmallint, ftInteger, ftWord, ftLargeint, ftLongWord, ftShortint, ftByte:
begin
{$IFDEF SYSJSON}
nJRA.Add(nField.AsInteger);
{$ENDIF}
{$IFDEF JSON_SO}
nJRA.Add(SO(nField.AsInteger));
{$ENDIF}
{$IFDEF QJSON}
nJRA.Add.AsInteger := nField.AsInteger;
{$ENDIF}
end;
ftFloat, ftBCD, ftSingle, ftExtended, ftCurrency:
begin
{$IFDEF SYSJSON}
nJRA.Add(nField.AsFloat);
{$ENDIF}
{$IFDEF JSON_SO}
nJRA.Add(SO(nField.AsFloat));
{$ENDIF}
{$IFDEF QJSON}
nJRA.Add.AsFloat := nField.AsFloat;
{$ENDIF}
end;
ftDate, ftTime, ftDateTime:
begin
{$IFDEF SYSJSON}
nJRA.Add(DateTimeToUnix(nField.AsDateTime));
{$ENDIF}
{$IFDEF JSON_SO}
nJRA.Add(SO(DateTimeToUnix(nField.AsDateTime)));
{$ENDIF}
{$IFDEF QJSON}
nJRA.Add.AsInt64 := DateTimeToUnix(nField.AsDateTime);
{$ENDIF}
end;
ftBlob, ftMemo, ftGraphic:
begin
nMSI.Clear;
nSSO.Clear;
{$IFDEF 7ZIP}
if nCompClassStr <> '' then
try
nMSC.Clear;
TBlobField(nField).SaveToStream(nMSC);
nMSC.Position := ;
with CreateOutArchive(TGUID.Create(nCompClassStr)) do
begin
AddStream(nMSC, soReference, faArchive, CurrentFileTime, CurrentFileTime,
ExtractFilePath(ParamStr()), False, False);
SaveToStream(nMSI);
end;
except
nMSI.Clear;
end
else
begin
{$ENDIF}
TBlobField(nField).SaveToStream(nMSI);
{$IFDEF 7ZIP}
end;
{$ENDIF}
nMSI.Position := ;
EncodeStream(nMSI, nSSO);
{$IFDEF SYSJSON}
nJRA.Add(nSSO.DataString);
{$ENDIF}
{$IFDEF JSON_SO}
nJRA.Add(SO(nSSO.DataString));
{$ENDIF}
{$IFDEF QJSON}
nJRA.Add('', nSSO.DataString);
{$ENDIF}
end;
else
{$IFDEF SYSJSON}
nJRA.Add(nField.AsString);
{$ENDIF}
{$IFDEF JSON_SO}
nJRA.Add(SO(nField.AsString));
{$ENDIF}
{$IFDEF QJSON}
nJRA.Add('', nField.AsString);
{$ENDIF}
end;
end;
end;
ADataSet.Next;
end;
AJSON := {$IFDEF SYSJSON}nJDS.ToString{$ENDIF}
{$IFDEF JSON_SO}nJDS.AsJSon(False, False){$ENDIF}
{$IFDEF QJSON}nJDS.Encode(False){$ENDIF}
;
Result := True;
except
end;
finally
{$IFDEF 7ZIP}
nMSC.Free;
{$ENDIF}
nMSI.Free;
nSSO.Free;
ADataSet.EnableControls;
{$IFDEF SYSJSON}
nJDS.Free;
{$ENDIF}
{$IFDEF QJSON}
nJDS.Free;
{$ENDIF}
end;
end; end.

JSON和数据集互相转换单元的更多相关文章

  1. go json null字段的转换

    最近试了试go中对json null字段进行转换,代码如下: struct 转 json: package main import ( "encoding/json" " ...

  2. SpringMVC关于json、xml自动转换的原理研究[附带源码分析]

    目录 前言 现象 源码分析 实例讲解 关于配置 总结 参考资料 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:http://www.c ...

  3. JSON转换类(二)--List转换成Json、对象集合转换Json等

    #region List转换成Json /// <summary> /// List转换成Json /// </summary> public static string Li ...

  4. SpringMVC关于json、xml自动转换的原理研究

    SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:http://www.cnblogs.com/fangjian0423/p/springMVC ...

  5. List转换成Json、对象集合转换Json等

    #region List转换成Json /// <summary> /// List转换成Json /// </summary> public static string Li ...

  6. SpringMVC关于json、xml自动转换的原理研究[附带源码分析 --转

    SpringMVC关于json.xml自动转换的原理研究[附带源码分析] 原文地址:http://www.cnblogs.com/fangjian0423/p/springMVC-xml-json-c ...

  7. 字符串json转换为xml xml转换json

    原文:字符串json转换为xml xml转换json // To convert an XML node contained in string xml into a JSON string XmlD ...

  8. java json与map互相转换(二)

      java json与map互相转换(二) CreationTime--2018年7月16日15点09分 Author:Marydon 1.准备工作 所需jar包: commons-beanutil ...

  9. java json与map互相转换(一)

      java json与map互相转换(一) CreationTime--2018年7月16日 Author:Marydon 1.准备工作 所需jar包:json-20180130.jar impor ...

随机推荐

  1. vim 使用

    vim有三种模式:输入模式,命令模式,底行模式,使用esc进入命令模式,在命令模式下按英文的冒号,进入底行模式:命令行模式下按i进入输入模式.vim编辑文件是将文件内容复制到缓冲区显示在屏幕上. vi ...

  2. 伪随机数(线性同余法)C语言

    /**Keil Lib*2015.6.12*Pass*by lort*/uint32 Srandx ; uint32 SrandK = 1103515245;//0x41C64E6D;uint32 S ...

  3. 配置SVN、GIT总结

    SVN使用说明 svn地址(可以是内网,也可以是外网的):svn://192.168.3.1/xxxhttp://192.168.3.1/xxxhttps://192.168.3.1/xxx 一个sv ...

  4. 【xcode5的使用】

    layout: post title: "WWDC 2013 Session笔记 - Xcode5和ObjC新特性" date: 2013-06-13 10:05 comments ...

  5. Android -- Activity,Fragment lifecycle

    Activity Lifecyce Fragment Lifecycle: 程序运行: 09-16 13:59:22.883 19022-19022/com.example.android.archi ...

  6. SpringMVC学习(三)整合SpringMVC和MyBatis

    工程结构 导入jar包 配置文件 applicationContext-dao.xml---配置数据源.SqlSessionFactory.mapper扫描器 applicationContext-s ...

  7. maven-replacer-plugin

    今天多认识了下这个maven插件. 基本用法: <plugin> <groupId>com.google.code.maven-replacer-plugin</grou ...

  8. 优雅的数组降维——Javascript中apply方法的妙用

    将多维数组(尤其是二维数组)转化为一维数组是业务开发中的常用逻辑,除了使用朴素的循环转换以外,我们还可以利用Javascript的语言特性实现更为简洁优雅的转换.本文将从朴素的循环转换开始,逐一介绍三 ...

  9. Requests库练习

    预备知识 字符串方法 用途 string.partition(str) 有点像 find()和 split()的结合体,从 str 出现的第一个位置起,把 字 符 串 string 分 成 一 个 3 ...

  10. winform用户控件、动态创建添加控件、timer控件、控件联动

    用户控件: 相当于自定义的一个panel 里面可以放各种其他控件,并可以在后台一下调用整个此自定义控件. 使用方法:在项目上右键.添加.用户控件,之后用户控件的编辑与普通容器控件类似.如果要在后台往窗 ...