2017-12-27 3 views
0

JSONファイルで、ノードからデータを抽出したいと思います。商品ノード内にあるブックノードまたは値を抽出したいとします。ここに私のJSONファイルがあります。C#のJsonファイルからノードを抽出する

JSON

{ 
    "store":[ 
     { 
     "name":"Sunshine Department Store", 
     "address":"Wangfujing Street", 
     "goods":{ 
      "book":[ 
       { 
        "category":"Reference", 
        "title":"Sayings of the Century", 
        "author":"Nigel Rees", 
        "price":8.88 
       }, 
       { 
        "category":"Fiction", 
        "title":"Sword of Honour", 
        "author":"Evelyn Waugh", 
        "price":12.66 
       } 
      ], 
      "bicycle":{ 
       "type":"GIANT OCR2600", 
       "color":"White", 
       "price":276 
      } 
     } 
     } 
    ] 
} 

コード私はこれらの線に沿ってデータを抽出するにはどうすればよい

private string ParseBookNode(JObject bookJSONFile) 
{ 
    JArray bookJson = null; 
    string bookFarmNode = null; 
    if (bookJSONFile != null && bookJSONFile["store"] != null) 
    { 
     bookJson = (JArray)bookJSONFile["store"]; 
     bookFarmNode = bookJson[0].ToString(); 

     if (bookJSONFile["book"] != null) 
     { 
      bookJson = (JArray)bookJSONFile["book"]; 
      bookFarmNode = bookJson[0].ToString(); 
     } 
    } 
    else 
    { 
     throw new Exception("Book node not found."); 
    } 
    return bookFarmNode; 
} 

if (bookJSONFile["book"] != null) 
{ 
    bookJson = (JArray)bookJSONFile["book"]; 
    bookFarmNode = bookJson[0].ToString(); 
} 
+0

'bookJSONFile [" book "]'は決して存在しません。代わりに 'bookFarmNode'を調べるつもりでしたか?その場合は、最初に「商品」オブジェクトにドリルダウンする必要があります。 JSONの構造と使用している変数をより慎重に確認してください。変数をより意味のある名前にすることは、おそらくコードを整理するのに役立ちます。 – ADyson

+0

はいダイソン、私の誤解はbookJson ["book"]です。 –

+0

それも存在しません。あなたのデータ構造をもう一度見てください。 bookJSONは "ストア"配列になります(なぜ、私はあなたが役に立たない変数名を持っていると言ったのですか)。 bookFarmNode(文字列ではなくオブジェクトにした場合)は、その配列の最初のオブジェクトになります。次に、その中から「商品」オブジェクトを取得し、次に「商品」オブジェクト内からブック配列を取得する必要があります。 – ADyson

答えて

0

あなたのコードは、データ構造にはほとんど関係を負い、そしてあなたの変数名は、おそらくあなたが適切にコードを整理する手助けされていない、混乱しています。

これは(私が恐れている)テストされていない限り、書籍配列(「ストア」配列の最初のオブジェクト)にアクセスすることができます。

private string ParseBookNode(JObject bookJSONFile) 
{ 
    JArray storeList = null; 
    JObject store = null; 
    JObject goods = null; 
    JArray bookList = null; 

    if (bookJSONFile != null && bookJSONFile["store"] != null) 
    { 
     storeList = (JArray)bookJSONFile["store"]; 
     store = bookJson[0]; 
     goods = store["goods"]; 

     if (goods["book"] != null) 
     { 
      bookList = (JArray)goods["book"]; 
     } 
    } 
    else 
    { 
     throw new Exception("File is empty, or Store node not found."); 
    } 
    return "something, not sure what you want to return here"; 
} 

間違いについて謝罪、うまくいけば、あなたは一般的なアイデアを得ます。 https://www.newtonsoft.com/json/help/html/Introduction.htmには、JArrayとJObjectの使用方法に関する包括的なドキュメントもあります。

0

これはJson.Netでアクセスできます。

このようなことができることを示すために、カテゴリ別に検索を追加しました。

public static JObject GetBook(JObject jObject, string category) 
    { 
     JObject returnValue = null; 
     try 
     { 
      var array = jObject.Property("store").Value; 
      var first = (JObject)array.FirstOrDefault(); 

      var goods = first?.Property("goods").Value; 

      var books = ((JObject)goods).Property("book").Value; 

      var booksArray = books as JArray; 

      foreach (JObject book in booksArray) 
      { 
       if (book.Property("category")?.Value?.ToString() == category) 
       { 
        returnValue = book; 
        break; 
       } 
      } 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e); 
      throw; 
     } 

     return returnValue; 
    } 
+0

あまりにも多くのキャスト... –

0

あなたがCinchoo ETL試すことができます - オープンソースのライブラリを解析する/ JSONファイルを書き込むこと。ここでは、解析することができますし、POCOのブックタイプが

public class Book 
{ 
    public string Category { get; set; } 
    public string Title { get; set; } 
    public string Author { get; set; } 
    public double Price { get; set; } 
} 

以下のように定義している場合、負荷の本はあなたがこのことができます

using (var jr = new ChoJSONReader<Book>("sample9.json").WithJSONPath("$..book") 
) 
{ 
    foreach (var x in jr) 
    { 
     Console.WriteLine($"Category: {x.Category}"); 
     Console.WriteLine($"Title: {x.Title}"); 
     Console.WriteLine($"Author: {x.Author}"); 
     Console.WriteLine($"Price: {x.Price}"); 
    } 
} 

希望以下のようにそれらをロードすることができ

using (var jr = new ChoJSONReader("sample9.json").WithJSONPath("$..book") 
    ) 
{ 
    foreach (var x in jr) 
    { 
     Console.WriteLine($"Category: {x.category}"); 
     Console.WriteLine($"Title: {x.title}"); 
     Console.WriteLine($"Author: {x.author}"); 
     Console.WriteLine($"Price: {x.price}"); 
    } 
} 

ノード方法です。

免責事項:私はライブラリの著者です。

関連する問題