2017-08-25 14 views
-3

私は何か意味のあるものに解析しようとしている複雑なJSonを持っています。私はC#Json.netを使用してデシリアライズしようとしていますが、私は必要な値を取得できません。私が必要とするのは、「集計」セクションの値を除くすべてのColDataノードの値です。私はオブジェクトを使用して逆直列化することができますが、私はそこにこだわっています。Json.netを使用してC#で複合Jsonを非直列化する

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

this postに記載されているようなJContainerを照会しようとしました。私はin the documentationのような断片をdeserlializingしようとしたと私はlinqを使用して説明したようにhereを試してみました。これまでの私の努力は様々な程度の「成功」を達成しましたが、私は得ようとしている価値を生み出していませんでした。最終的に、このデータはWPF DataGridにバインドされて表示されます。

編集: を追加しました全体のJSONファイル

これらは、カップルが何かを取得しようとしているが、私は両方のケースでは、NULL値に遭遇します。

 // 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()); 
       } 

     } 

編集2: @Eserは、出発点として与えたものを使用して、私は、値のリストを取得することができていますが、残念ながらそれは、値の一覧だけです。代わりに、私はここで

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

を取得

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

のようなものを取得する私は、値のリストを取得するために使用しているコードです:

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

コードで、あなたが試したもののいくつかの例を掲示し、期待どおりに動作しない方法を説明してください。 – kettch

+0

また、有効/完全なjsonを投稿して、人々がそれに取り組むことができるようにします。 –

+0

なぜあなたは正規表現を使用しようとしないのですか? – Youssef13

答えて

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

または

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

ありがとう@Eser。私は値のリストを取得するための出発点としてこれを使用しましたが、私はまだそれを使用可能にしようとしています。"デザインの収入"、 "ID": "82" }、 { "値": "975.00" あなたの答えからコードを使用して、私はこの '{[ { "値" のように見えるの値を取得します } ]} 'リストから値にアクセスできませんでした。私は "Design Income"と "975.00"が必要です。 – mack

+0

@mack *あなたの質問に答えの難しい部分を取り、あなたの新しい無能を*あなたの質問を拡張します。これは質問をする方法ですか?とにかく私は答えを一度遠くに更新しました。 – Eser

+0

これに時間を割いていただき、ありがとうございます。私は自分の編集で質問を変更するつもりはなく、元の質問に新しい情報を追加するだけでした。申し訳ありませんが、元の質問を変更した場合。あなたの助けをもう一度ありがとう。あなたの答えは、正しい方向に私を再び動かしました。 – 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; } 
    } 

し、それを使用します。

Example results = Newtonsoft.JSON.JsonConvert.DeserializeObject<Example>(json); 
関連する問題