2017-08-28 68 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>));