mormot2生成JSON和解析JSON的功能非常强大,也非常灵活,灵活的结果就是有时候有点乱。下面总结了最简单的一种使用方法

要解析的JSON如下,基本涉及了要解析的所有类型。

JsonContent:='
{
    "head": {
        "jzDate": "2023-08-22",
        "saleNo": "2023081770711821",
        "ssTotal": -98.00,
        "xsDate": "2023-08-17 15:03:01",
    },
    "pay": [
        {
            "saleNo": "2023081770711821",
            "ssTotal": -98.00,
            "zfCode": "9410",
            "zfName": "电商",
            "zfTotal": -98.00
        }
    ],
    "salePlu": [
        {
            "barCode": "2000830153165",
            "pluID": 80020000276608,
            "pluName": "百威七星伴月月饼礼盒",
            "price": 98.0000,
            "saleNO": "2023081770711821",
            "spec": "880g",
            "ssTotal": -98.00,
            "unit": "盒",
            "xsCount": -1,
            "xsDate": "2023-08-17 15:03:01",
        }
    ]
}
';

首先引用单元mormot.core.variants, mormot.core.text,mormot.core.base, mormot.core.json

var
    JsonData:Variant;
    BillHead:Variant;
    SaleNO:string;
    PluArray:Variant;
    PluItem:Variant;
    I:integer;
    pluID:Int64;
    pluName,PluUnit:string;
    Price:double;
begin
    JsonData:= _Json(JsonContent);  //将JSON字符串转换为Json的对象 VariantSaveJSON(JSONValue)可以将
                                    //Variant对象直接转成JSON字符串
    //JsonParam.Exists('head');     //判断节点是否存在
    //JsonParam.head.Exists('saleNo')//直接判断子节点是否存在
    BillHead:= JsonData.head;
    SaleNO:=BillHead.saleNo;     //直接取值即可,如果不存在会报异常
    PluArray:=JsonData.salePlu;   //还是直接取
    for I:=0 to PluArray._Count-1 do
    begin
       PluItem:=_Safe(PluList)^.Value[I]; 
       pluID:=PluItem.pluID;
       pluName:=PluItem.pluName;
       Price:=PluItem.price;
       PluUnit:=_Safe(PluItem)^.S['unit']; //个别Json节点名与系统关键字冲突的可以改为这种方式
    end;
end;

其它场景

var
  Order: Variant;
  PluList: Variant;
  PluItem: Variant;
 begin
  TDocVariant.New(Order);
  Order.entId := 0; //企业ID
  Order.posId := '20230910225580001'; //POSID
  //初始化商品信息
   TDocVariant.New(PluItem);
   PluItem.rowNo := 1; //销售商品行号
   PluItem.pluCode := '100038'; //商品编码
  //将商品信息增加到JSONArray中
   TDocVariantData(PluList).AddItem(PluItem) ;
   Order.pluList:=PluList;
 end;
// !var
// ! Doc: TDocVariantData; // stack-allocated variable
// !begin
// ! Doc.Init;
// ! Doc.AddValue('name','John');
// ! assert(Doc.Value['name']='John');
// ! assert(variant(Doc).name='John');
// !end;

// ! var v: PVariant;
// ! ...
// ! dv.InitArray([1, 3, 3, 4]);
// ! for v in dv.Items do
// ! writeln(v^);
// ! // output 1 2 3 4

// ! var d: PDocVariantData;
// ! ...
// ! dv.InitJson('[{a:1,b:1},1,"no object",{a:2,b:2}]');
// ! for d in dv.Objects do
// ! writeln(d^.ToJson);
// ! // output {"a":1,"b":1} and {"a":2,"b":2} only
// ! // (ignoring 1 and "no object" items)
// ! var Doc: TDocVariantData;
// ! i: integer;
// !begin
// ! Doc.Init;
// ! Doc.AddItem('one');
// ! Doc.AddItem(2);
// ! Doc.AddItem(3.0);
// ! assert(Doc.Count=3);
// ! for i := 0 to Doc.Count-1 do
// ! writeln(Doc.Value[i]);

// !Doc.InitObject(['name','John','year',1972]);
// which is the same as:
// ! var Doc: TDocVariantData;
// !begin
// ! Doc.Init;
// ! Doc.AddValue('name','John');
// ! Doc.AddValue('year',1972);
// !end;

待续.....


本文由 王守红 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论