簡體   English   中英

使用NewtonSoft反序列化在c#中訪問深度嵌套的JSON對象

[英]Accessing deeply nested JSON objects in c# using NewtonSoft Deserialization

我很難到達JSON中一些深層嵌套的對象

我有一個目錄,其中包含大約500個需要讀取的JSON文件,並從中輸出某些數據,因此我按以下方式加載文件:

public static void getJsonFiles()
{
    int i = 0;
    string directory = @"Z:\My_JSON_FILES\DataFilesForAnalysis\DataFilesAsJSON";
    string[] jsonPath = Directory.GetFiles(directory, "*.json");
    foreach(string item in jsonPath)
    {
        jsonReader(item, i);
        i++;
    }
}

加載文件后,我將通過File.ReadAllText進行讀取,因此我可以這樣做:

public static void jsonReader(string item, int i)
{
    string readJson = File.ReadAllText(item);
    RootObject rootObj = JsonConvert.DeserializeObject<RootObject>(readJson);

    var resReport = rootObj.ResultsReport;
...

我已經使用json2csharp創建了所有JSON的對象,但是當我嘗試使用點表示法(rootObj.ResultsReport.FinalReport.VariantProperties.VariantProperty.VariantName)訪問深度嵌套的對象時,出現錯誤消息“對象不包含定義對於FinalReport,沒有擴展方法FinalReport ...”

我的對象定義如下:

public class VariantProperty
{
    public string geneName { get; set; }
    public string isVUS { get; set; }
    public string variantName { get; set; }
}

public class VariantProperties
{
    public string[] VariantProperty { get; set; }
}

public class FinalReport
{
    public Object Application { get; set; }
    public string ReportId { get; set; }
    public string SampleName { get; set; }
    public string Version { get; set; }
    public Object Sample { get; set; }
    public string PertinentNegatives { get; set; }
    public Object Summaries { get; set; }
    public Object VariantProperties { get; set; }
    public Object Genes { get; set; }
    public Object Trials { get; set; }
    public Object References { get; set; }
    public Object Signatures { get; set; }
    public Object AAC { get; set; }
}

public class ResultsReport
{
    public Object FinalReport { get; set; }
    public Object VariantReport { get; set; }
}

public class RootObject
{
    public Object ResultsReport { get; set; }
}

JSON如下所示:

"ResultsReport": {
"CustomerInformation": null,
"FinalReport": {
  "@xmlns:xsd": "http://www.w3.org/2001/XMLSchema",
  "@StagingId": "XXXXXXXX",
  "@clinicalId": "XXXXXXXX",
  "Application": {
    "ApplicationSettings": {
      "ApplicationSetting": {
        "Name": "Statement",
        "Value": "XXXXXXXX"
      }
    }
  },
  "ReportId": "XXXXXXXX",
  "SampleName": "XXXXXXXX",
  "Version": "1",
  "Sample": {
    "FM_Id": "XXXXXXXX",
    "SampleId": "XXXXXXXX",
    "BlockId": "XXXXXXXX",
    "TRFNumber": "XXXXXXXX",
    "TestType": "XXXXXXXX",
    "SpecFormat": "XXXXXXXX",
    "ReceivedDate": "XXXXXXXX"
  },
  "PertinentNegatives": null,
  "Summaries": {
    "@alterationCount": "XXXXXXXX",
    "@clinicalTrialCount": "XXXXXXXX",
    "@resistiveCount": "XXXXXXXX",
    "@sensitizingCount": "XXXXXXXX"
  },
  "VariantProperties": {
    "VariantProperty": [
      {
        "@geneName": "BARD1",
        "@isVUS": "true",
        "@variantName": "P358_S364del"
      },
      {
        "@geneName": "GATA2",
        "@isVUS": "true",
        "@variantName": "P161A"
      },
      {
        "@geneName": "LRP1B",
        "@isVUS": "true",
        "@variantName": "V4109I"
      },
      {
        "@geneName": "MLL2",
        "@isVUS": "true",
        "@variantName": "P1191L"
      },
      {
        "@geneName": "NTRK1",
        "@isVUS": "true",
        "@variantName": "G18E"
      },
      {
        "@geneName": "NUP98",
        "@isVUS": "true",
        "@variantName": "A447T"
      },
      {
        "@geneName": "TET2",
        "@isVUS": "true",
        "@variantName": "D1121Y"
      },
      {
        "@geneName": "WT1",
        "@isVUS": "true",
        "@variantName": "T377_G397>S"
      }
    ]
  }

我究竟做錯了什么? 我遵循了很多不同的例子,但它似乎無法正常工作

寫像

public ResultsReport ResultsReport { get; set;  }

public FinalReport FinalReport { get; set; }

您使用對象作為屬性類型,那是錯誤的,這與JSON反序列化無關。

正如Volkan所說,問題不是JSON反序列化。 我通過像這樣構造類來使json工作:

 public class VariantProperty
{
    public string geneName { get; set; }
    public string isVUS { get; set; }
    public string variantName { get; set; }
}

public class VariantProperties
{
    public List<VariantProperty> VariantProperty { get; set; }
}

public class FinalReport
{
    public Object Application { get; set; }
    public string ReportId { get; set; }
    public string SampleName { get; set; }
    public string Version { get; set; }
    public Object Sample { get; set; }
    public string PertinentNegatives { get; set; }
    public Object Summaries { get; set; }
    public VariantProperties VariantProperties { get; set; }
    public Object Genes { get; set; }
    public Object Trials { get; set; }
    public Object References { get; set; }
    public Object Signatures { get; set; }
    public Object AAC { get; set; }
}

public class ResultsReport
{
    public FinalReport FinalReport { get; set; }
}

public class RootObject
{
    public ResultsReport ResultsReport { get; set; }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM