首页 > 解决方案 > 如何在 C# 中解析嵌套的 JSON 数据结构

问题描述

我正在尝试解析以下 JSON 数据结构:

{
    Command: "somecommand", 
    ContractNo: "11111111", 
    DocsFiles:  [{DocumentID: "01", Files: [{DocKey: "Key01", PrimKey: "PKey01"}, 
                                          {DocKey: "Key01", PrimKey: "PKey02"}],
                {DocumentID: "02", Files: [{DocKey: "Key02", PrimKey: "PKey03"}, 
                                          {DocKey: "Key02", PrimKey: "PKey04"}]]
}

这是一个代码:

public class Result
{
    public string DocumentID {get; set;}
    public List<Files> FilesList {get; set;}

    public class Files
    {
        public string DocKey {get; set;}
        public string PrimKey {get; set;}
    }
}


private void shareDocumentFiles(RequestContext pContext)
{   
    try
    {
        string vContractNo = pContext.JsonParameters["ContractNo"].ToString();

        var vFiles = pContext.JsonParameters["DocsFiles"].ToString();

        var results = JsonConvert.DeserializeObject<List<Result>>(vFiles);

        ...

我可以获得“DocumentID”值,但无法获得“DocKey”或“PrimKey”值。

var DocID = results[0].DocumentID;

请帮助解决这个问题。

标签: c#jsonnested

解决方案


我将您的 JSON 更改为:

{
  "Command": "somecommand",
  "ContractNo": "11111111",
  "DocsFiles": [
    {
      "DocumentID": "01",
      "Files": [
        {
          "DocKey": "Key01",
          "PrimKey": "PKey01"
        },
        {
          "DocKey": "Key01",
          "PrimKey": "PKey02"
        }
      ]
    },
    {
      "DocumentID": "02",
      "Files": [
        {
          "DocKey": "Key02",
          "PrimKey": "PKey03"
        },
        {
          "DocKey": "Key02",
          "PrimKey": "PKey04"
        }
      ]
    }
  ]
}

然后我创建了三个简单的匹配类:

public class InputClass
{
    public string Command { get; set; }
    public string ContractNo { get; set; }
    public List<DocFile> DocFiles { get; set; }
}

public class DocFile
{
    public string DocumentID { get; set;}
    public List<FileInfo> Files { get; set; }
}
public class FileInfo
{
    public string DocFile { get; set;}
    public string PrimKey { get; set; }
}

然后我阅读了 JSON 的内容并使用以下方法对其进行反序列化:

 var fileContents = File.ReadAllText("DocFiles.json");
 var docFiles = JsonConvert.DeserializeObject<DocFile>(fileContents);

它就像一个魅力。请注意,您DocFiles是一个集合,就像DocKey/PrimKey对一样。

如果您的合同编号和文档 ID 必须始终为数字,您可能希望将它们键入为整数而不是字符串(在这种情况下,它们会丢失 JSON 中的引号)


推荐阅读