2016-07-08 9 views
3

私はこのようになりますJSONレスポンスを持っている:特定のJsonノードをDictionary <string、object>に逆シリアル化する方法

{ 
"success": true, 
"more": false, 
"results_html": "a lot of html in here", 
"listinginfo": { 
    "637640274112277168": { 
     "listingid": "637640274112277168", 
     "price": 50, 
     "fee": 7, 
     "publisher_fee_app": 730, 
     "publisher_fee_percent": "0.10000000149011612", 
     "currencyid": "2005", 
     "steam_fee": 2, 
     "publisher_fee": 5, 
     "converted_price": 1, 
     "converted_fee": 2, 
     "converted_currencyid": "2003", 
     "converted_steam_fee": 1, 
     "converted_publisher_fee": 1, 
     "converted_price_per_unit": 1, 
     "converted_fee_per_unit": 2, 
     "converted_steam_fee_per_unit": 1, 
     "converted_publisher_fee_per_unit": 1, 
     "asset": { 
      "currency": 0, 
      "appid": 730, 
      "contextid": "2", 
      "id": "6542776191", 
      "amount": "1" 
     } 
    }, 
    "194035710805671301": { 
     "listingid": "194035710805671301", 
     "price": 0, 
     "fee": 0, 
     "publisher_fee_app": 730, 
     "publisher_fee_percent": "0.10000000149011612", 
     "currencyid": "2001", 
     "asset": { 
      "currency": 0, 
      "appid": 730, 
      "contextid": "2", 
      "id": "6825071309", 
      "amount": "0" 
     } 

    }, 

    }//end listinginfo 
//more fields here.. 
} 

私はちょうどノード「listinginfo」から情報を取得し、文字列は、例えばだろうdictionary<string, NewListedItem>にそれらを追加する必要があります:「637640274112277168」リストはそのサブノードからのすべての情報を含む "NewListedItem"型になります。私のクラスは次のようになります:

class listinginfo 
{ 
    public Dictionary<string, NewListedItem> Items; 

} 
class Asset 
{ 
    public string currency { get; set; } 
    public string appid { get; set; } 
    public string contextid { get; set; } 
    public string id { get; set; } 
    public string amount { get; set; } 
} 
class NewListedItem 
{ 

    public string listingid { get; set; } 
    public string price { get; set; } 
    public string fee { get; set; } 
    public string publisher_fee_app { get; set; } 
    public string publisher_fee_percent { get; set; } 
    public string steam_fee { get; set; } 
    public string publisher_fee { get; set; } 
    public string converted_price { get; set; } 
    public string converted_fee { get; set; } 
    public string converted_currencyid { get; set; } 
    public string converted_steam_fee { get; set; } 
    public string converted_publisher_fee { get; set; } 
    public string converted_fee_per_unit { get; set; } 
    public string converted_steam_fee_per_unit { get; set; } 
    public string converted_publisher_fee_per_unit { get; set; } 
    public Asset asset { get; set; } 


} 

私はこれをどのように達成できますか?

+0

サードパーティのライブラリJSon.Netを使用したい場合は、これを簡単に行うことができます。この密接に関連した質問を参照してください... http://stackoverflow.com/questions/15789539/deserialize-array-of-key-value-pairs-using-json-net – dazedandconfused

+0

@dazedandconfusedは質問として見ています* tagged * [tag :json.net]、私はそれがうまくいくと期待しています... –

+2

@MarcGravell - そうです。コーヒーがそのことをやり遂げるまで私のコメントはこれ以上ない。 – dazedandconfused

答えて

1

あなたは本当にとても近いです。 JSONプロパティー名をミラーリングするには、ルートクラス内の辞書プロパティーの名前をItemsからlistinginfoに変更する必要があることを除いて、クラスを定義したとおりに正しく動作します。 ([JsonProperty]属性を使用してItems辞書をJSONのlistinginfoプロパティにマップすることもできます)。変更後、listinginfoのルートクラスの名前をListingResponseのように変更することをおすすめしますそれは厳密には必要ではありません。その後

public class ListingResponse 
{ 
    [JsonProperty("listinginfo")] 
    public Dictionary<string, NewListedItem> Items { get; set; } 
} 

、あなたにあなたのJSONをデシリアライズすることができるはずです:あなたは属性アプローチを好む場合は、

public class ListingResponse 
{ 
    public Dictionary<string, NewListedItem> listinginfo { get; set; } 
} 

をまたは:

それらの変更後は、お使いのルートクラスは次のようになります。あなたが期待するように、このクラスと辞書が移入されます

ListingResponse response = JsonConvert.DeserializeObject<ListingResponse>(json); 

フィドル:https://dotnetfiddle.net/V8LsXY

+0

ああ、私はこれをやって解決した: JToken root = JObject.Parse(response); JToken testToken = root ["listinginfo"]; し、testTokenをDeserializeObjectに渡します。とにかく、ありがとうございます。 – ddacot

0
  public class TestClass 
      { 

       private void Test() 
       { 
        var json = "{\r\n \"637640274112277168\": {\r\n  \"listingid\": \"637640274112277168\",\r\n  \"price\": 50,\r\n  \"fee\": 7,\r\n  \"publisher_fee_app\": 730,\r\n  \"publisher_fee_percent\": \"0.10000000149011612\",\r\n  \"currencyid\": \"2005\",\r\n  \"steam_fee\": 2,\r\n  \"publisher_fee\": 5,\r\n  \"converted_price\": 1,\r\n  \"converted_fee\": 2,\r\n  \"converted_currencyid\": \"2003\",\r\n  \"converted_steam_fee\": 1,\r\n  \"converted_publisher_fee\": 1,\r\n  \"converted_price_per_unit\": 1,\r\n  \"converted_fee_per_unit\": 2,\r\n  \"converted_steam_fee_per_unit\": 1,\r\n  \"converted_publisher_fee_per_unit\": 1,\r\n  \"asset\": {\r\n   \"currency\": 0,\r\n   \"appid\": 730,\r\n   \"contextid\": \"2\",\r\n   \"id\": \"6542776191\",\r\n   \"amount\": \"1\"\r\n  }\r\n },\r\n \"194035710805671301\": {\r\n  \"listingid\": \"194035710805671301\",\r\n  \"price\": 0,\r\n  \"fee\": 0,\r\n  \"publisher_fee_app\": 730,\r\n  \"publisher_fee_percent\": \"0.10000000149011612\",\r\n  \"currencyid\": \"2001\",\r\n  \"asset\": {\r\n   \"currency\": 0,\r\n   \"appid\": 730,\r\n   \"contextid\": \"2\",\r\n   \"id\": \"6825071309\",\r\n   \"amount\": \"0\"\r\n  }\r\n }\r\n }\r\n\r\n"; 
        Dictionary<string, NewListedItem> values = JsonConvert.DeserializeObject<Dictionary<string, NewListedItem>>(json); 

       } 
      } 
      class listinginfo 
      { 
       public Dictionary<string, List<NewListedItem>> Items; 

      } 
      class Asset 
      { 
       public string currency { get; set; } 
       public string appid { get; set; } 
       public string contextid { get; set; } 
       public string id { get; set; } 
       public string amount { get; set; } 
      } 
      class NewListedItem 
      { 

       public string listingid { get; set; } 
       public string price { get; set; } 
       public string fee { get; set; } 
       public string publisher_fee_app { get; set; } 
       public string publisher_fee_percent { get; set; } 
       public string steam_fee { get; set; } 
       public string publisher_fee { get; set; } 
       public string converted_price { get; set; } 
       public string converted_fee { get; set; } 
       public string converted_currencyid { get; set; } 
       public string converted_steam_fee { get; set; } 
       public string converted_publisher_fee { get; set; } 
       public string converted_fee_per_unit { get; set; } 
       public string converted_steam_fee_per_unit { get; set; } 
       public string converted_publisher_fee_per_unit { get; set; } 
       public Asset asset { get; set; } 


      } 
+0

Newtonsoft.Jsonの参照を追加します。 –

+0

Install-Package Newtonsoft.Json -Version 6.0.7 –

+0

JSONレスポンスの残りの部分をダンプしても機能します。しかし、すべての応答とあなたのコードを実行すると、与えます:エラー値Trueを入力する 'steambot.NewListedItem'。パス 'success'、1行目、15行目.jsonから見ると、最初の行も解析されます。 Ideeaは、DeserializeObjectにlistinginfoノードだけを渡す方法ですか? – ddacot

1

だから私は、きれいな方法でこれを行うことができませんでしたが、私は、これはあなたが探しているものであると信じて:

var jsonString = @"{ 
      'success': true, 
      'more': false, 
      'results_html': 'a lot of html in here', 
      'listinginfo': { 
       '637640274112277168': { 
        'listingid': '637640274112277168', 
        'price': 50, 
        'fee': 7, 
        'publisher_fee_app': 730, 
        'publisher_fee_percent': '0.10000000149011612', 
        'currencyid': '2005', 
        'steam_fee': 2, 
        'publisher_fee': 5, 
        'converted_price': 1, 
        'converted_fee': 2, 
        'converted_currencyid': '2003', 
        'converted_steam_fee': 1, 
        'converted_publisher_fee': 1, 
        'converted_price_per_unit': 1, 
        'converted_fee_per_unit': 2, 
        'converted_steam_fee_per_unit': 1, 
        'converted_publisher_fee_per_unit': 1, 
        'asset': { 
             'currency': 0, 
         'appid': 730, 
         'contextid': '2', 
         'id': '6542776191', 
         'amount': '1' 
        } 
       }, 
       '194035710805671301': { 
        'listingid': '194035710805671301', 
        'price': 0, 
        'fee': 0, 
        'publisher_fee_app': 730, 
        'publisher_fee_percent': '0.10000000149011612', 
        'currencyid': '2001', 
        'asset': { 
          'currency': 0, 
          'appid': 730, 
          'contextid': '2', 
          'id': '6825071309', 
          'amount': '0' 
         } 

       }, 
       } 
     }"; 
     var json = JObject.Parse(jsonString); 

     List<JToken> results = json["listinginfo"].Children().Children().ToList(); 
     var dictionaryResults = new ListingInfo(); 

     foreach (var token in results) 
     { 
      var info = JsonConvert.DeserializeObject<NewListedItem>(token.ToString()); 

      List<NewListedItem> listInfo = new List<NewListedItem>(); 
      listInfo.Add(info); 

      dictionaryResults.Items = new Dictionary<string, List<NewListedItem>>(); 
      dictionaryResults.Items.Add(info.Listingid, listInfo); 
     } 

私はまた、あなたのクラスのプロパティ名を少し変更:

public class Asset 
    { 
     public string Currency { get; set; } 
     public string Appid { get; set; } 
     public string Contextid { get; set; } 
     public string Id { get; set; } 
     public string Amount { get; set; } 
    } 
    public class NewListedItem 
    { 

     public string Listingid { get; set; } 
     public string Price { get; set; } 
     public string Fee { get; set; } 
     [JsonProperty("publisher_fee_app")] 
     public string PublisherFeeApp { get; set; } 
     [JsonProperty("publisher_fee_percent")] 
     public string PublisherFeePercent { get; set; } 
     [JsonProperty("steam_fee")] 
     public string SteamFee { get; set; } 
     [JsonProperty("publisher_fee")] 
     public string PublisherFee { get; set; } 
     [JsonProperty("converted_price")] 
     public string ConvertedPrice { get; set; } 
     [JsonProperty("converted_fee")] 
     public string ConvertedFee { get; set; } 
     [JsonProperty("converted_currencyid")] 
     public string ConvertedCurrencyid { get; set; } 
     [JsonProperty("converted_steam_fee")] 
     public string ConvertedSteamFee { get; set; } 
     [JsonProperty("converted_publisher_fee")] 
     public string ConvertedPublisherFee { get; set; } 
     [JsonProperty("converted_fee_per_unit")] 
     public string ConvertedFeePerUnit { get; set; } 
     [JsonProperty("converted_steam_fee_per_unit")] 
     public string ConvertedSteamFeePerUnit { get; set; } 
     [JsonProperty("converted_publisher_fee_per_unit")] 
     public string ConvertedPublisherFeePerUnit { get; set; } 
     public Asset Asset { get; set; } 


    } 
関連する問題