2015-07-20 59 views
1

我不認爲這篇文章的標題解釋了什麼是問題,但我不知道如何說出它。 基本上我有一個從API這種反應,其中我已經無法控制:通過變化這樣JSON.Net獲取動態對象

 "variations":{ 
      "1033308042319364133":{ 
       "id":"1033308042319364133", 
       "order":null, 
       "created_at":"2015-07-20 13:45:45", 
       "updated_at":"2015-07-20 13:47:11", 
       "title":"Male", 
       "mod_price":"+0.00", 
       "modifier":1033306667720114205, 
       "product":0, 
       "difference":"+£0.00" 
      }, 
      "1033308953984892967":{ 
       "id":"1033308953984892967", 
       "order":null, 
       "created_at":"2015-07-20 13:47:34", 
       "updated_at":"2015-07-20 13:47:34", 
       "title":"Female", 
       "mod_price":"+0.00", 
       "modifier":1033306667720114205, 
       "product":0, 
       "difference":"+£0.00" 
      }, 
      "1033309404260204585":{ 
       "id":"1033309404260204585", 
       "order":null, 
       "created_at":"2015-07-20 13:48:27", 
       "updated_at":"2015-07-20 13:48:27", 
       "title":"Male (Junior)", 
       "mod_price":"+0.00", 
       "modifier":1033306667720114205, 
       "product":0, 
       "difference":"+£0.00" 
      }, 
      "1033309540147265579":{ 
       "id":"1033309540147265579", 
       "order":null, 
       "created_at":"2015-07-20 13:48:44", 
       "updated_at":"2015-07-20 13:48:44", 
       "title":"Female (Junior)", 
       "mod_price":"+0.00", 
       "modifier":1033306667720114205, 
       "product":0, 
       "difference":"+£0.00" 
      } 
     } 
在我的C#代碼我環路

// Get our child variants 
var variations = model["variations"]; 
var IsNull = IsJTokenNull(variations); 
var variants = !IsNull ? new List<VariationResponseModel>() : null; 

// If we have some variations 
if (!IsNull) 
{ 

    // Loop through our variations 
    foreach (var variant in variations) 
    { 

     // Add our variant to our list 
     variants.Add(CreateVariants(variant.First)); 
    } 
} 

正如你所看到的,我使用variant.First選擇屬性內的對象。我的問題是,這是做這件事的最好方法嗎?這似乎是一個可怕的黑客。

+0

你可以創建一個與你已經序列化的對象相匹配的.NET對象,然後將json反序列化成該類型的對象嗎? – Chris

+2

它看起來像你應該做的是反序列化到一個'Dictionary ',那麼你應該能夠循環通過鍵(如果你不需要它,你可以把它轉換成一個簡單的列表鍵)。 –

回答

1

這看起來像.net Dictionary不止一個列表。如果VariationResponseModel有正確的屬性,你可以只是做:

​​

或使用JObject

var variants = JObject.Parse(variations).ToObject<Dictionary<string, Variant>>(); 

這兩種方法是等價的,並假設你有你的輸入作爲一個JSON字符串。如果你的輸入已經是一個JObject,你可以使用:

var variants = variations.ToObject<Dictionary<string, Variant>>() 

如果您需要在列表中的變體/枚舉之後,只需使用variants.Values

(JsonConvert/JObject從Json.net解串器)

+1

如果它已經是'JObject',那麼使用'ToObject()'將獲得相同的結果。 –

+0

VariationResponseModel只有2個屬性(Id和Title),但是JSON對象比這個更多。 – r3plica

+0

好吧,一個顯而易見的方法是爲所有其他屬性創建一個類,或者展開VariationResponseModel類 – SWeko