0

I am having a very difficult time reaching some deeply nested objects in my JSON

I have a directory with roughly 500 JSON files that I need to read through, and output certain data from so I load the files like this:

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++;
    }
}

Once I have the file loaded, I am reading it through File.ReadAllText so I am doing this:

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

    var resReport = rootObj.ResultsReport;
...

I have created objects of all of the JSON using json2csharp, but when I try to access the deeply nested objects using dot notation (rootObj.ResultsReport.FinalReport.VariantProperties.VariantProperty.VariantName), I get an error 'Object does not contain a definition for FinalReport and no extension method FinalReport...'

My object definition looks like this:

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; }
}

The JSON looks like this:

"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"
      }
    ]
  }

What am I doing wrong? I've followed so many different examples but it just wont seem to work

2 Answers 2

1

Write properties like

public ResultsReport ResultsReport { get; set;  }

public FinalReport FinalReport { get; set; }

You are using object as property type, thats wrong, it is not about JSON deserialization.

Sign up to request clarification or add additional context in comments.

Comments

0

As Volkan said the issue isn't the JSON deserialization. I got your json working by structuring my classes like so:

 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; }
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.