2013-07-31 61 views
1

我有一個JSON字符串,我試圖用C#解析。我已經使用JsonConvert將我的數據序列化爲JSON字符串。從C#中的對象(反序列化json)中檢索數據#

這裏是我的示例JSON字符串:

{"names": ["John", "Joe", "Jack"], "nationality": "American"} 

我能這個字符串反序列化爲使用JsonConvert.DeserializeObject(x);

的問題是,我不知道如何從對象讀取對象,使用C# 。有人可以幫我嗎?

回答

1
public class People 
{ 
    [JsonProperty("names")] 
    public List<string> Names; 

    [JsonProperty("nationality")] 
    public string Nationality; 
} 

其他答案在技術上是正確的,但使用JsonPropertyAttribute是一個普遍接受的約定。然後使用JsonConvert

var people = JsonConvert.DeserializeObject<People>(x); 
+1

+1我是一個良好的文檔代碼的粉絲,即使'JsonProperty'不是必需的,我可以通過查看與Json序列化一起使用的對象來知道,而不需要讀取其他代碼行 –

1

一個更好的方法是定義一個類與預期的結構,然後用JavaScriptSerializer到反序列化:

class NameSet 
{ 
    public IList<string> names { get; set; } 
    public string nationality { get; set; } 
} 

var serializer = new JavaScriptSerializer(); 
var nameset = serializer.Deserialize<NameSet>(jsonString); 
+0

謝謝,工作就像一個魅力! – pat

1

創建一個自定義類這樣的:

public class CustomData 
{ 
    public string[] Names { get; set; } 
    public string Nationality { get; set; } 

    public CustomData() { } 
} 

並使用JsonConvert來反序列化喲這種類型的對象:

CustomData data = JsonConvert.DeserializeObject<CustomData>(x); 
1

以下應該足夠了:

public class PeopleGroup { 

    public string[] names { get; set; } 
    public string nationality { get; set } 

} 

var myObject = JsonConvert.DeserializeObject<PeopleGroup>(x); 

基本上,你創建一個強類型的對象,並直接deserialise進去。

1

如果你不想實際上定義一個類時,你可以使用匿名類型:

string json = "{\"names\": [\"John\", \"Joe\", \"Jack\"], \"nationality\": \"American\"}"; 

// Just defining the structure of the anonymous type 
var x = new { names = new string[0], nationality = string.Empty }; 

x = JsonConvert.DeserializeAnonymousType(json, x); 
+0

嗨,剛剛嘗試過這個和它的工作完美,只是想知道是否有任何優勢,使用這種方法與「類」方法,除了更少的代碼當然謝謝 – pat

+3

這個解決方案是_writeable_,但犧牲_readability_,哪一個更重要您取決於您​​期望在將來查看您的代碼的殺毒程序員數量。 –

+2

@pat兩個缺點:Mi也不是:它創建了一個對象,然後再被扔掉。重大:對象必須在該代碼塊內完全處理,這可能會導致在稍後的日期重構代碼時遇到困難。 –

0

您應該使用dataContractJsonSerializer類,它是速度更快,最重要的是它是.Net框架的內置類。我將在我的下一個社區中發佈解決方案,那我們如何使用DataContractJsonSerializer類。現在我不能發佈解決方案,因爲在我的最終網絡太慢:(但我會今天發佈。