2017-08-28 147 views
0

我不是C#程序員,而是不時地玩這種語言。我想知道,如果我有一個JSON字符串,我想使用JavaScriptSerializer.DeserializeObject進行反序列化,我該怎麼做。舉例來說,如果我有一個JSON:C#反序列化使用JavaScriptSerializer.DeserializeObject的JSON

{ 
    "Name": "col_name2", 
    "Value": [ 
     { 
      "From": 100, 
      "To": 200 
     }, 
     { 
      "From": 100, 
      "To": 200 
     } 
    ] 
} 

而且我有一個變量JSON字符串名爲sJson

using System.Web.Script.Serialization; 
... 

JavaScriptSerializer jss = new JavaScriptSerializer(); 
Object json = jss.DeserializeObject(sJson); 

,現在我該怎樣利用這個Object json變量?

注:我已經知道如何使用System.Web.Script.Serialization.Deserialize<T>方法。

+0

在這種情況下的結果將是一個'Dictionary ',其中一個項目的鍵將是''Name'',其值爲''col_name2'',另一個值爲''value'使用'object []'的值,即json數組內的兩個對象。你應該創建一些類來反序列化,讓你的生活變得更容易。 –

+0

謝謝。事實上,它的工作原理就像你說的那樣,唯一的不是對象json而是我必須使用動態json = jss.DeserializeObject(sJson);那正是阻止我的原因。 – vivanov

回答

1

看看thi的帖子對戴維斯答:

Deserialize json object into dynamic object using Json.net

你可以把它變成一個動態的(基本類型是JObject) 然後你就可以比訪問這樣的信息:

JavaScriptSerializer jss = new JavaScriptSerializer(); 
dynamic json = jss.DeserializeObject(sJson); 
Console.WriteLine(json["Name"]); // use as Dictionary 

我寧願創建數據傳輸對象(DTO)將您的JSON結構表示爲ac#類。

+0

你在代碼示例中使用Json.Net的地方在哪裏? –

+0

它編譯,但在運行時拋出一個異常:'System.Collections.Generic.Dictionary '不包含 作爲'Name'的定義。 – vivanov

+0

好吧,我想通了:我必須這樣調用它:Console.WriteLine(json [「Name」]); – vivanov

0

你可以爲這個特定的情況下,宣佈新的自定義類:

public class CustomClass 
{ 
    public string Name { get; set; } 
    public List<ValueClass> Value { get; set; } 
} 

public class ValueClass 
{ 
    public int From { get; set; } 
    public int To { get; set; } 
} 

然後直接序列化到這些類(解串器將自動映射正確的屬性):

JavaScriptSerializer jss = new JavaScriptSerializer(); 
CustomClass json = (CustomClass)jss.Deserialize(sJson, typeof(CustomClass)); 

此外,如果您有超過1項,這也很容易:

List<CustomClass> json = (List<CustomClass>)jss.Deserialize(sJson, typeof(List<CustomClass>));