在Delphi 7中使用LKJSON生成JSON数组

时间:2017-05-10 01:56:52

标签: json delphi

我想生产这样的东西:

{
  "nrVendas": 2, 
  "totalVendas": 100.0, 
  "vendas": [ 
    {
      "nsuOrigem": "1",
      "data": "2014-03-14",
      "nrParcelas": 1,
      "valor": 50,
      "parcelas": [
        {
          "numero": 1,
          "valor": 50
        }
      ]
    }, 
    {
      "nsuOrigem": "2",
      "data": "2014-03-14",
      "nrParcelas": 1,
      "valor": 50,
      "parcelas": [
        {
          "numero": 1,
          "valor": 50
        }
      ]
    }
  ]
}

我正在尝试这种方式:

js3 := TlkJSONobject.Create;
js3.Add('numero', '1');
js3.Add('valor', '50');

js32 :=  TlkJSONobject.Create;
js32.Add('numero', '1');
js32.Add('valor', '100');

js2 := TlkJSONobject.Create;
js2.Add('nsuOrigem', '1');
js2.Add('data', '2014-02-02');
js2.Add('nrParcelas', 1);
js2.Add('valor', 50);
js2.Add('parcelas', js3);

js2.Add('nsuOrigem', '2');
js2.Add('data', '2014-02-02');
js2.Add('nrParcelas', 1);
js2.Add('valor', 50);
js2.Add('parcelas', js32);

js0 := TlkJSONobject.Create;
js0.Add('numeroVendas', 2);
js0.Add('totalVendas', 100.0);
js0.Add('vendas', js2);

i := 0;
s := GenerateReadableText(js0, i);

Memo2.Lines.Add(s);

但我接受了这个:

{
  "numeroVendas": 2,
  "totalVendas": 100,
  "vendas": {
    "nsuOrigem": "1",
    "data": "2014-02-02",
    "nrParcelas": 1,
    "valor": 50,
    "parcelas": {
      "numero": "1",
      "valor": "50"
    },
    "nsuOrigem": "2",
    "data": "2014-02-02",
    "nrParcelas": 1,
    "valor": 50,
    "parcelas": {
      "numero": "1",
      "valor": "100"
    }
  }
}

然后我尝试验证这个JSON,但是我收到了这个错误:

  

SyntaxError:第13行重复键'nsuOrigem'

我想我需要在vendas内的字段上使用数组,但我搜索了所有文档等等,但我找不到任何可以帮助我的内容。

1 个答案:

答案 0 :(得分:2)

您根本不创建任何数组。 vendasparcelas都是一个对象数组,但您创建它们的目的却是单个对象。

您还将一些JSON值创建为字符串而不是数字。

使用TlkJSONlist类创建数组,例如:

js4_1 := TlkJSONobject.Create;
js4_1.Add('numero', 1);
js4_1.Add('valor', 50);

js4_2 := TlkJSONobject.Create;
js4_2.Add('numero', 1);
js4_2.Add('valor', 100);

js3_1 := TlkSONlist.Create;
js3_1.Add(js4_1);

js3_2 := TlkSONlist.Create;
js3_2.Add(js4_2);

js2_1 := TlkJSONobject.Create;
js2_1.Add('nsuOrigem', '1');
js2_1.Add('data', '2014-02-02');
js2_1.Add('nrParcelas', 1);
js2_1.Add('valor', 50);
js2_1.Add('parcelas', js3_1);

js2_2.Add('nsuOrigem', '2');
js2_2.Add('data', '2014-02-02');
js2_2.Add('nrParcelas', 1);
js2_2.Add('valor', 50);
js2_2.Add('parcelas', js3_2);

js1 := TlkJSONlist.Create;
js1.Add(js2_1);
js1.Add(js2_2);

js0 := TlkJSONobject.Create;
js0.Add('numeroVendas', 2);
js0.Add('totalVendas', 100.0);
js0.Add('vendas', js1);

i := 0;
s := GenerateReadableText(js0, i);

Memo2.Lines.Add(s);

但请,给你的变量更有意义的名字!并且更改类构造的顺序,它将使代码更容易阅读和遵循,例如:

root := TlkJSONobject.Create;
root.Add('numeroVendas', 2);
root.Add('totalVendas', 100.0);
vendas := TlkJSONList.Create;
root.Add('vendas', vendas);

venda := TlkJSONobject.Create;
vendas.Add(venda);
venda.Add('nsuOrigem', '1');
venda.Add('data', '2014-02-02');
venda.Add('nrParcelas', 1);
venda.Add('valor', 50);
parcelas := TlkJSONlist.Create;
venda.Add('parcelas', parcelas);

parcela := TlkJSONobject.Create;
parcelas.Add(parcela);
parcela.Add('numero', 1);
parcela.Add('valor', 50);

venda := TlkJSONobject.Create;
vendas.Add(venda);
venda.Add('nsuOrigem', '1');
venda.Add('data', '2014-02-02');
venda.Add('nrParcelas', 1);
venda.Add('valor', 50);
parcelas := TlkJSONlist.Create;
venda.Add('parcelas', parcelas);

parcela := TlkJSONobject.Create;
parcelas.Add(parcela);
parcela.Add('numero', 1);
parcela.Add('valor', 100);

i := 0;
s := GenerateReadableText(root, i);

Memo2.Lines.Add(s);