2015-06-15 43 views
5

反序列化格式不正確的JSON我有JSON的一個片段,看起來像這樣:與JSON.NET

{"123":{"name":"test","info":"abc"}} 

123是一個ID,並且可以在每個請求而改變。這超出了我的控制範圍。

我想使用JSON.NET反序列化JSON。我曾嘗試:

User u = JsonConvert.DeserializeObject<User>(json); 

然而,這並不工作,除非我定義了JsonProperty屬性,像這樣:

[JsonProperty("123")] 
public string ID { get; set; } 

但是,當然,我可以真正做到這一點不會因爲ID 123將在每次請求改變。

如何使用JSON.NET讀取ID屬性並將其應用於ID類?

+1

它可以使用'KeyValuePair '。你可以嘗試在臨時的'object'緩衝區中反序列化它,然後將它映射到你的'User'實例。 –

+2

它不是畸形的;只是笨拙地形成。基本上它是一個的KVP,其中用戶具有屬性'name'和'info' –

+0

我想,在你的類結構中必須定義第一類RootObject。在類Rootobject中,你必須聲明所有的json屬性爲get方法。 –

回答

4

試試這個:

var json = "{\"123\":{\"name\":\"test\",\"info\":\"abc\"}}"; 

var rootObject = JsonConvert.DeserializeObject<Dictionary<string, User>>(json); 
var user = rootObject.Select(kvp => new User 
            { ID = kvp.Key, 
             Name = kvp.Value.Name, 
             Info = kvp.Value.Info 
            }).First(); 

這確實有一些不必要的開銷,但考慮到的情況下,它會做。

+1

同意但作品 - 謝謝。 –

0

一下怎麼樣JSON形成如下(如果有的話改變JSON模式是允許的):

{ 
    "ID": "123", 
    "Properties":{"name":"test","info":"abc"} 
} 

這樣,它必須是可行的。

+0

抱歉不允許 - 我在問題中做了大膽的處理;-) –

1

我會做這種方式:

dynamic result = JsonConvert.DeserializeObject(json); 

var myObject = result as JObject; 
var properties = myObject.Properties(); 
var property = properties.FirstOrDefault(); // take first element 
string name = property.Name; 

foreach (var item in properties) 
{ 
    var jProperty = item as JProperty; 
    var nestedJson = jProperty.Value.ToString(); 
    dynamic nestedResult = JsonConvert.DeserializeObject(nestedJson); // or put it into a model/data structure 
} 
+0

感謝 - 現在有趣但很棘手的實際用戶數據。 –

+1

我知道...但你也可以反序列化嵌套對象...更新我的答案。 – stefankmitph