2017-08-25 1 views
-3

Ich habe einige komplexe JSon, die ich versuche, in etwas Sinnvolles zu analysieren. Ich versuche, mit C# Json.net deserialize, aber ich kann nicht die Werte, die ich brauche. Was ich brauche, ist der Wert von jedem ColData-Knoten außer denen in einem "Zusammenfassung" -Abschnitt. Ich bin in der Lage, ein Objekt zu deserialisieren, aber ich stecke dort fest.Deserialize Komplex Json in C# mit Json.net

string pandltext = @"{ 
    "Header": { 
    "Time": "2017-08-24T08:32:58-07:00", 
    "ReportName": "ProfitAndLoss", 
    "ReportBasis": "Accrual", 
    "StartPeriod": "2017-06-01", 
    "EndPeriod": "2017-06-30", 
    "SummarizeColumnsBy": "Total", 
    "Currency": "USD", 
    "Option": [ 
     { 
     "Name": "AccountingStandard", 
     "Value": "GAAP" 
     }, 
     { 
     "Name": "NoReportData", 
     "Value": "false" 
     } 
    ] 
    }, 
    "Columns": { 
    "Column": [ 
     { 
     "ColTitle": "", 
     "ColType": "Account", 
     "MetaData": [ 
      { 
      "Name": "ColKey", 
      "Value": "account" 
      } 
     ] 
     }, 
     { 
     "ColTitle": "Total", 
     "ColType": "Money", 
     "MetaData": [ 
      { 
      "Name": "ColKey", 
      "Value": "total" 
      } 
     ] 
     } 
    ] 
    }, 
    "Rows": { 
    "Row": [ 
     { 
     "Header": { 
      "ColData": [ 
      { 
       "value": "Income" 
      }, 
      { 
       "value": "" 
      } 
      ] 
     }, 
     "Rows": { 
      "Row": [ 
      { 
       "ColData": [ 
       { 
        "value": "Design income", 
        "id": "82" 
       }, 
       { 
        "value": "975.00" 
       } 
       ], 
       "type": "Data" 
      }, 
      { 
       "ColData": [ 
       { 
        "value": "Discounts given", 
        "id": "86" 
       }, 
       { 
        "value": "-30.50" 
       } 
       ], 
       "type": "Data" 
      }, 
      { 
       "Header": { 
       "ColData": [ 
        { 
        "value": "Landscaping Services", 
        "id": "45" 
        }, 
        { 
        "value": "360.00" 
        } 
       ] 
       }, 
       "Rows": { 
       "Row": [ 
        { 
        "Header": { 
         "ColData": [ 
         { 
          "value": "Job Materials", 
          "id": "46" 
         }, 
         { 
          "value": "" 
         } 
         ] 
        }, 
        "Rows": { 
         "Row": [ 
         { 
          "ColData": [ 
          { 
           "value": "Fountains and Garden Lighting", 
           "id": "48" 
          }, 
          { 
           "value": "550.00" 
          } 
          ], 
          "type": "Data" 
         }, 
         { 
          "ColData": [ 
          { 
           "value": "Plants and Soil", 
           "id": "49" 
          }, 
          { 
           "value": "1820.72" 
          } 
          ], 
          "type": "Data" 
         }, 
         { 
          "ColData": [ 
          { 
           "value": "Sprinklers and Drip Systems", 
           "id": "50" 
          }, 
          { 
           "value": "30.00" 
          } 
          ], 
          "type": "Data" 
         } 
         ] 
        }, 
        "Summary": { 
         "ColData": [ 
         { 
          "value": "Total Job Materials" 
         }, 
         { 
          "value": "2400.72" 
         } 
         ] 
        }, 
        "type": "Section" 
        } 
       ] 
       }, 
       "Summary": { 
       "ColData": [ 
        { 
        "value": "Total Landscaping Services" 
        }, 
        { 
        "value": "2760.72" 
        } 
       ] 
       }, 
       "type": "Section" 
      }, 
      { 
       "ColData": [ 
       { 
        "value": "Pest Control Services", 
        "id": "54" 
       }, 
       { 
        "value": "-100.00" 
       } 
       ], 
       "type": "Data" 
      }, 
      { 
       "ColData": [ 
       { 
        "value": "Sales of Product Income", 
        "id": "79" 
       }, 
       { 
        "value": "44.00" 
       } 
       ], 
       "type": "Data" 
      }, 
      { 
       "ColData": [ 
       { 
        "value": "Services", 
        "id": "1" 
       }, 
       { 
        "value": "400.00" 
       } 
       ], 
       "type": "Data" 
      } 
      ] 
     }, 
     "Summary": { 
      "ColData": [ 
      { 
       "value": "Total Income" 
      }, 
      { 
       "value": "4049.22" 
      } 
      ] 
     }, 
     "type": "Section", 
     "group": "Income" 
     }, 
     { 
     "Summary": { 
      "ColData": [ 
      { 
       "value": "Gross Profit" 
      }, 
      { 
       "value": "4049.22" 
      } 
      ] 
     }, 
     "type": "Section", 
     "group": "GrossProfit" 
     }, 
     { 
     "Header": { 
      "ColData": [ 
      { 
       "value": "Expenses" 
      }, 
      { 
       "value": "" 
      } 
      ] 
     }, 
     "Rows": { 
      "Row": [ 
      { 
       "Header": { 
       "ColData": [ 
        { 
        "value": "Automobile", 
        "id": "55" 
        }, 
        { 
        "value": "19.99" 
        } 
       ] 
       }, 
       "Rows": { 
       "Row": [ 
        { 
        "ColData": [ 
         { 
         "value": "Fuel", 
         "id": "56" 
         }, 
         { 
         "value": "179.15" 
         } 
        ], 
        "type": "Data" 
        } 
       ] 
       }, 
       "Summary": { 
       "ColData": [ 
        { 
        "value": "Total Automobile" 
        }, 
        { 
        "value": "199.14" 
        } 
       ] 
       }, 
       "type": "Section" 
      }, 
      { 
       "Header": { 
       "ColData": [ 
        { 
        "value": "Job Expenses", 
        "id": "58" 
        }, 
        { 
        "value": "108.09" 
        } 
       ] 
       }, 
       "Rows": { 
       "Row": [ 
        { 
        "Header": { 
         "ColData": [ 
         { 
          "value": "Job Materials", 
          "id": "63" 
         }, 
         { 
          "value": "" 
         } 
         ] 
        }, 
        "Rows": { 
         "Row": [ 
         { 
          "ColData": [ 
          { 
           "value": "Decks and Patios", 
           "id": "64" 
          }, 
          { 
           "value": "88.09" 
          } 
          ], 
          "type": "Data" 
         } 
         ] 
        }, 
        "Summary": { 
         "ColData": [ 
         { 
          "value": "Total Job Materials" 
         }, 
         { 
          "value": "88.09" 
         } 
         ] 
        }, 
        "type": "Section" 
        } 
       ] 
       }, 
       "Summary": { 
       "ColData": [ 
        { 
        "value": "Total Job Expenses" 
        }, 
        { 
        "value": "196.18" 
        } 
       ] 
       }, 
       "type": "Section" 
      }, 
      { 
       "Header": { 
       "ColData": [ 
        { 
        "value": "Legal & Professional Fees", 
        "id": "12" 
        }, 
        { 
        "value": "" 
        } 
       ] 
       }, 
       "Rows": { 
       "Row": [ 
        { 
        "ColData": [ 
         { 
         "value": "Accounting", 
         "id": "69" 
         }, 
         { 
         "value": "75.00" 
         } 
        ], 
        "type": "Data" 
        }, 
        { 
        "ColData": [ 
         { 
         "value": "Lawyer", 
         "id": "71" 
         }, 
         { 
         "value": "100.00" 
         } 
        ], 
        "type": "Data" 
        } 
       ] 
       }, 
       "Summary": { 
       "ColData": [ 
        { 
        "value": "Total Legal & Professional Fees" 
        }, 
        { 
        "value": "175.00" 
        } 
       ] 
       }, 
       "type": "Section" 
      }, 
      { 
       "ColData": [ 
       { 
        "value": "Maintenance and Repair", 
        "id": "72" 
       }, 
       { 
        "value": "185.00" 
       } 
       ], 
       "type": "Data" 
      }, 
      { 
       "ColData": [ 
       { 
        "value": "Meals and Entertainment", 
        "id": "13" 
       }, 
       { 
        "value": "5.66" 
       } 
       ], 
       "type": "Data" 
      }, 
      { 
       "ColData": [ 
       { 
        "value": "Rent or Lease", 
        "id": "17" 
       }, 
       { 
        "value": "900.00" 
       } 
       ], 
       "type": "Data" 
      }, 
      { 
       "Header": { 
       "ColData": [ 
        { 
        "value": "Utilities", 
        "id": "24" 
        }, 
        { 
        "value": "" 
        } 
       ] 
       }, 
       "Rows": { 
       "Row": [ 
        { 
        "ColData": [ 
         { 
         "value": "Gas and Electric", 
         "id": "76" 
         }, 
         { 
         "value": "114.09" 
         } 
        ], 
        "type": "Data" 
        }, 
        { 
        "ColData": [ 
         { 
         "value": "Telephone", 
         "id": "77" 
         }, 
         { 
         "value": "74.36" 
         } 
        ], 
        "type": "Data" 
        } 
       ] 
       }, 
       "Summary": { 
       "ColData": [ 
        { 
        "value": "Total Utilities" 
        }, 
        { 
        "value": "188.45" 
        } 
       ] 
       }, 
       "type": "Section" 
      } 
      ] 
     }, 
     "Summary": { 
      "ColData": [ 
      { 
       "value": "Total Expenses" 
      }, 
      { 
       "value": "1849.43" 
      } 
      ] 
     }, 
     "type": "Section", 
     "group": "Expenses" 
     }, 
     { 
     "Summary": { 
      "ColData": [ 
      { 
       "value": "Net Operating Income" 
      }, 
      { 
       "value": "2199.79" 
      } 
      ] 
     }, 
     "type": "Section", 
     "group": "NetOperatingIncome" 
     }, 
     { 
     "Header": { 
      "ColData": [ 
      { 
       "value": "Other Expenses" 
      }, 
      { 
       "value": "" 
      } 
      ] 
     }, 
     "Rows": { 
      "Row": [ 
      { 
       "ColData": [ 
       { 
        "value": "Miscellaneous", 
        "id": "14" 
       }, 
       { 
        "value": "916.00" 
       } 
       ], 
       "type": "Data" 
      } 
      ] 
     }, 
     "Summary": { 
      "ColData": [ 
      { 
       "value": "Total Other Expenses" 
      }, 
      { 
       "value": "916.00" 
      } 
      ] 
     }, 
     "type": "Section", 
     "group": "OtherExpenses" 
     }, 
     { 
     "Summary": { 
      "ColData": [ 
      { 
       "value": "Net Other Income" 
      }, 
      { 
       "value": "-916.00" 
      } 
      ] 
     }, 
     "type": "Section", 
     "group": "NetOtherIncome" 
     }, 
     { 
     "Summary": { 
      "ColData": [ 
      { 
       "value": "Net Income" 
      }, 
      { 
       "value": "1283.79" 
      } 
      ] 
     }, 
     "type": "Section", 
     "group": "NetIncome" 
     } 
    ] 
    } 
} 


// Deserialize to object 
var rootObj = JsonConvert.DeserializeObject<ProfitLoss.Rootobject>(pandltext); 

Ich habe versucht, eine JContainer Abfrage wird in this post erwähnt. Ich habe versucht, ein Fragment zu deserlializing wie erwähnt in the documentation und ich habe versucht mit linq wie erwähnt here in der Dokumentation. Bis jetzt haben alle meine Bemühungen unterschiedliche Grade von "Erfolg" erreicht, aber keiner hat die Werte hervorgebracht, die ich versuche zu bekommen. Eventuell werden diese Daten zur Ansicht an ein WPF DataGrid gebunden.

Edit: Hinzugefügt gesamte Json-Datei

Dies sind ein paar etwas zu bekommen versucht, aber ich laufe in null-Werte in beiden Fällen.

 // This always returns null 
     var results2 = doc.Descendants() 
        .OfType<JObject>() 
        .Where(x => x[ "value" ] != null); 


     // This gives me a null exception error 
     var doc1 = (JContainer) o[ "Rows" ]; 
     foreach (var row in rootObj.Rows.Row) 
     { 
       // Get a null exception 
       foreach (var row2 in row.Rows.Row) 
       { 
        Console.WriteLine(row2.ToString()); 
       } 

     } 

Edit 2: Mit was @Eser als Ausgangspunkt gab, kann ich eine Liste von Werten zu erhalten, aber leider ist es nur eine Liste von Werten. Statt etwas wie

"Design income", "975.00" 
"Discounts given", "-30.50" 

immer ich

"Design income" 
"975" 
"Discounts given" 
"-30.50" 

Hier ist der Code ich eine Liste von Werten erhalten bin mit:

var jObj = JObject.Parse(pandltext); 
var results = jObj.SelectTokens("$..Rows.Row[?(@.type == 'Data')]..value").ToList(); 
+0

Bitte senden Sie einige Beispiele dafür, was Sie versucht haben, mit dem Code, und beschreiben, wie es ist, nicht wie erwartet funktioniert. – kettch

+0

Geben Sie auch einen gültigen/vollständigen JSON ein, damit die Benutzer daran arbeiten können. –

+0

Warum versuchen Sie nicht, Regex zu verwenden? – Youssef13

Antwort

2
var jObj = JObject.Parse(json); 

var colData = jObj.SelectTokens("$..ColData") 
       .Except(jObj.SelectTokens("$..Summary.ColData")) 
       .ToList(); 

EDIT

foreach(var item in colData) 
{ 
    Console.WriteLine(string.Join("=", item.Select(x => x["value"]))); 
} 

oder

var finalList = colData.Select(item => item.Select(x => (string)x["value"]).ToList()) 
       .ToList(); 
+0

Danke @Eser. Ich habe das als Ausgangspunkt verwendet, um eine Liste von Werten zu erhalten, aber ich versuche immer noch, es nutzbar zu machen.Verwenden Sie den Code aus Ihrer Antwort bekomme ich einen Wert, der wie dieser '{[ { "Wert" aussieht: "Design-Einkommen", "id": "82" }, { "Wert": "975.00" } ]} 'und ich konnte nicht auf die Werte von der Liste zugreifen. Ich brauche "Design Income" und "975.00". – mack

+0

@mack * Nehmen Sie den kniffligen Teil der Antwort in Ihre Frage und erweitern Sie Ihre Frage mit Ihrer neuen Unfähigkeit *. Ist das die Art, eine Frage zu stellen? Jedenfalls habe ich die Antwort ein für allemal aktualisiert. – Eser

+0

Ich freue mich, dass Sie sich die Zeit genommen haben, dies zu beantworten. Ich wollte die Frage nicht mit meiner Bearbeitung ändern, sondern nur neue Informationen zur ursprünglichen Frage hinzufügen. Entschuldigung, wenn das die ursprüngliche Frage geändert hat. Danke nochmal für deine Hilfe. Deine Antwort brachte mich wieder in die richtige Richtung. – mack

-1
    public class Option 
    { 
         public string Name { get; set; } 
        public string Value { get; set; } 
   } 

    public class Header 
    { 
        public DateTime Time { get; set; } 
        public string ReportName { get; set; } 
        public string ReportBasis { get; set; } 
        public string StartPeriod { get; set; } 
        public string EndPeriod { get; set; } 
        public string SummarizeColumnsBy { get; set; } 
        public string Currency { get; set; } 
        public IList<Option> Option { get; set; } 
    } 

    public class MetaData 
    { 
        public string Name { get; set; } 
        public string Value { get; set; } 
    } 

    public class Column 
    { 
        public string ColTitle { get; set; } 
        public string ColType { get; set; } 
        public IList<MetaData> MetaData { get; set; } 
    } 

    public class Columns 
    { 
        public IList<Column> Column { get; set; } 
    } 

    public class ColData 
    { 
        public string value { get; set; } 
        public string id { get; set; } 
    } 

    public class ColData 
    { 
        public string value { get; set; } 
        public string id { get; set; } 
    } 

    public class Row 
   { 
          public IList<ColData> ColData { get; set; } 
        public string type { get; set; } 
    } 

    public class Rows 
    { 
        public IList<Row> Row { get; set; } 
    } 

    public class ColData 
    { 
        public string value { get; set; } 
    } 

    public class Summary 
    { 
        public IList<ColData> ColData { get; set; } 
    } 

    public class ColData 
    { 
        public string value { get; set; } 
        public string id { get; set; } 
    } 

    public class Row 
    { 
        public  Header { get; set; } 
        public Rows Rows { get; set; } 
        public Summary Summary { get; set; } 
        public string type { get; set; } 
        public IList<ColData> ColData { get; set; } 
    } 

    public class Rows 
    { 
        public IList<Row> Row { get; set; } 
    } 

    public class Row 
    { 
        public IList<ColData> ColData { get; set; } 
        public string type { get; set; } 
        public  Header { get; set; } 
        public Rows Rows { get; set; } 
        public  Summary { get; set; } 
    } 

    public class Rows 
    { 
        public IList<Row> Row { get; set; } 
    } 

    public class Row 
    { 
        public  Header { get; set; } 
        public Rows Rows { get; set; } 
        public  Summary { get; set; } 
        public string type { get; set; } 
        public string group { get; set; } 
    } 

    public class Rows 
    { 
        public IList<Row> Row { get; set; } 
    } 

    public class Example 
    { 
        public Header Header { get; set; } 
        public Columns Columns { get; set; } 
        public Rows Rows { get; set; } 
    } 

und verwenden Sie es mit:

Example results = Newtonsoft.JSON.JsonConvert.DeserializeObject<Example>(json);