JSON和数据集互相转换单元
如题......只是一个单元, 为了测试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和数据集互相转换单元的更多相关文章
- go json null字段的转换
最近试了试go中对json null字段进行转换,代码如下: struct 转 json: package main import ( "encoding/json" " ...
- SpringMVC关于json、xml自动转换的原理研究[附带源码分析]
目录 前言 现象 源码分析 实例讲解 关于配置 总结 参考资料 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:http://www.c ...
- JSON转换类(二)--List转换成Json、对象集合转换Json等
#region List转换成Json /// <summary> /// List转换成Json /// </summary> public static string Li ...
- SpringMVC关于json、xml自动转换的原理研究
SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:http://www.cnblogs.com/fangjian0423/p/springMVC ...
- List转换成Json、对象集合转换Json等
#region List转换成Json /// <summary> /// List转换成Json /// </summary> public static string Li ...
- SpringMVC关于json、xml自动转换的原理研究[附带源码分析 --转
SpringMVC关于json.xml自动转换的原理研究[附带源码分析] 原文地址:http://www.cnblogs.com/fangjian0423/p/springMVC-xml-json-c ...
- 字符串json转换为xml xml转换json
原文:字符串json转换为xml xml转换json // To convert an XML node contained in string xml into a JSON string XmlD ...
- java json与map互相转换(二)
java json与map互相转换(二) CreationTime--2018年7月16日15点09分 Author:Marydon 1.准备工作 所需jar包: commons-beanutil ...
- java json与map互相转换(一)
java json与map互相转换(一) CreationTime--2018年7月16日 Author:Marydon 1.准备工作 所需jar包:json-20180130.jar impor ...
随机推荐
- Unity3D NGUI动态生成模糊背景图
先上效果. 制作原理:模糊的部分是用UITexture,前面是一个UISprite.用主摄像机渲染出一张纹理,把这张纹理模糊处理,把这张纹理赋值给UITexture. 脚本代码 using Unity ...
- 【XLL 框架库函数】 TempBool/TempBool12
创建一个包含了 Boolean 类型的 TRUE 或 FALSE 的 XLOPER/XLOPER12 LPXLOPER TempBool(int b); LPXLOPER12 TempBool12(i ...
- quartz 线程问题
2个任务一起使用quartz来调度,但是有一个任务总是会莫名其妙的暂停掉,排查了下,原来组内成员在写JOB任务时候,在JOB中写了个while(true) { 执行业务 休眠10分钟} 导 ...
- C#运算符
运算符 1.算数运算符 赋值运算符 等号在C#中并不是表示相等的意思,而是表示赋值,把等号右边的值赋值给 等号左边的变量 由等号连接的表达式,叫做赋值表达式.我们要求等号两边的数据类型必须一 致. 2 ...
- Note3 :《集体智慧编程》用户相似度计算
欧几里德距离评价: 以经过人们一致评价的物品为坐标轴,然后将参与评价的人绘制到图上,并考察他们彼此之间的距离远近.计算出每一轴向上的差值,求平方之后再相加,最后对总和取平方根. # -*- codin ...
- Spring Security笔记:Hello World
本文演示了Spring Security的最最基本用法,二个页面(或理解成二个url),一个需要登录认证后才能访问(比如:../admin/),一个可匿名访问(比如:../welcome) 注:以下内 ...
- linux日志文件
linux日志文件 在系统运行正常的情况下学习了解这些不同的日志文件有助于你在遇到紧急情况时从容找出问题并加以解决. /var/log/messages — 包括整体系统信息,其中也包含系统启动期间的 ...
- Asp.net导出Excel(HTML输出方法)
主要思路: 实例化Gridview,将值绑定后输出...(用烂了的方法) 贴上核心代码: public static void ExportToExcel(DataTable dataList, st ...
- RocketMQ与kafka对比(18项差异)-转自阿里中间件
淘宝内部的交易系统使用了淘宝自主研发的Notify消息中间件,使用Mysql作为消息存储媒介,可完全水平扩容,为了进一步降低成本,我们认为存储部分可以进一步优化,2011年初,Linkin开源了Kaf ...
- JS中对象排序
详细代码如下: var s=[{name:"abc",value:10},{name:"dbc",value:5},{name:"acc", ...