JsonSerializerでのデータ読込

解決


monkey  2023-10-03 05:04:57  No: 151156  IP: 192.*.*.*

以下のようなJSONデータがあり
{
 "ReturnCode":0,
 "ReturnMsg":"処理は正常に終了しました。",
 "Result":[
           {
            "KihonInfo":{
                         "KjnCode":"0000002"
                        },
            "NencyoInfo":{
                          "StatusId":"3"
                         }
           },
           {
            "KihonInfo":{
                         "KjnCode":"0000003"
                        },
            "NencyoInfo":{
                          "StatusId":"2"
                         }
           },
           {
            "KihonInfo":{
                         "KjnCode":"1"
                        },
            "NencyoInfo":{
                          "StatusId":"3"
                         }
           },
           null
          ]
}

以下のようなプログラムで読み込ませようとすると

procedure TForm1.Button1Click(Sender: TObject);
type
  TKihonInfo = record
    KjnCode : String;
  end;

  TNencyoInfo = record
    StatusId : String;
  end;

  TResult = record
    KihonInfo  : TArray<TKihonInfo>;
    NencyoInfo : TArray<TNencyoInfo>;
  end;

  TRoot = record
    ReturnCode : Integer;
    ReturnMsg  : String;
    Result     : TResult;
  end;
var
  jsWork : TJsonSerializer;
  Root : TRoot;
  strJson : String;
begin

  strJson := '上記JSONデータ';

  jsWork := TJsonSerializer.Create;

  try
    Root := jsWork.Deserialize<TRoot>(strJson);
  finally
    jsWork.DisposeOf;
  end;

end;

    Root := jsWork.Deserialize<TRoot>(strJson);
のところで
「JSON配列の読み取り中に予期しない型がみつかりました」
のエラーとなります。
構造体の定義が不正かと思い色々試していますが解消できません。
どこがまずいでしょうか?

編集 削除
mam  2023-10-03 06:37:27  No: 151159  IP: 192.*.*.*

とりあえず、動いたのが以下ですね。

uses System.JSON.Serializers;

procedure TForm1.Button1Click(Sender: TObject);
type
  TKihonInfo=Record
    KjnCode:String;
  end;
  TNenchoInfo=Record
    StatusId:String;
  end;
  TResult=Record
    KihonInfo:TKihonInfo;
    NencyoInfo:TNenchoInfo;
  end;
  TRoot=record
    ReturnCode:Integer;
    ReturnMsg:String;
    Result:Array of TResult;
  end;
var st:string;
    js:TJsonSerializer;
    root:TRoot;
begin
  st:='{'+
   '"ReturnCode":0,'+
   '"ReturnMsg":"処理は正常に終了しました。",'+
   '"Result":['+
   '  {'+
   '    "KihonInfo":{"KjnCode":"0000002"},'+
   '    "NencyoInfo":{"StatusId":"3"}'+
   '  },'+
   '  {'+
   '    "KihonInfo":{"KjnCode":"0000003"},'+
   '    "NencyoInfo":{"StatusId":"2"}'+
   '  },'+
   '  null'+
   ']'+
   '}';

   js:=TJsonSerializer.Create;
   root:=js.Deserialize<TRoot>(st);

end;

はずしていたらすいません。

編集 削除
monkey  2023-10-03 07:28:33  No: 151160  IP: 192.*.*.*

mam様
ご教示のコードを参考に
    var kc := Root.Result[0].KihonInfo.KjnCode;
にてデータの取得もできました。
ありがとうございました。

編集 削除
mam  2023-10-03 08:18:35  No: 151161  IP: 192.*.*.*

良かったです。
js.Free
を忘れてました。すいません。

編集 削除