如何使用DataContractJsonSerializer来解析嵌套的json对象?

时间:2014-11-27 15:54:33

标签: c# json

我有一个像这样的json文本:

{
    "response":200,
    "result":
  {
      "package":
    {
      "token":"aaa"
    }
  }
}

我正在使用DataContractJsonSerializer从上面的json中提取信息。

public static T Deserialize<T>(string json)
{
    var instance = Activator.CreateInstance<T>();
    using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
    {
         var serializer = new DataContractJsonSerializer(instance.GetType());
         return (T)serializer.ReadObject(ms);
    }
}

我将课程描述如下:

[DataContract]
class IttResponse
{
    [DataMember(Name = "response")]
    public int Response { get; protected set; }

    [DataMember(Name = "result")]
    public string Result { get; protected set; }
}

[DataContract]
public class IttPackage
{

    [DataMember(Name = "token")]
    public string Token { get; set; }
}

现在,我尝试解析json文本如下:

IttResponse response = Deserialize<IttResponse>(jsonText);
IttPackage package = Deserialize<IttPackage>(response.token);

但是,在第一行解析jsonText时总是会出错。

注意:我正在开发一个在C#,VS Ultimate 2013,.Net Framework 4.5上编写的桌面上运行的应用程序

所以,我认为,我不能使用 System.Web.Helpers System.Web.Script.Serialization 来解析。

2 个答案:

答案 0 :(得分:4)

序列化引擎了解复杂类型。一个DataContract类型引用另一个DataContract类型是安全的。

(编辑:我不完全确定是否允许受保护的设置者)

[DataContract]
class IttResponse
{
    [DataMember(Name = "response")]
    public int Response { get; protected set; }

    [DataMember(Name = "result")]
    public IttResult Result { get; protected set; }
}

[DataContract]
public class IttResult
{
    [DataMember(Name = "package")]
    public IttPackage Package { get; set; }
}

[DataContract]
public class IttPackage
{
    [DataMember(Name = "token")]
    public string Token { get; set; }
}

用法与之前相同

IttResponse response = Deserialize(jsonText);

答案 1 :(得分:1)

您可以将IttPackage添加到IttResposne对象中,这样您只需解析json一次。此外,我认为您不能对属性的protected方法使用set修饰符,因此请尝试将其删除。

    [DataContract]
    class IttResponse
    {
        [DataMember(Name = "response")]
        public int Response { get; set; }

        [DataMember(Name = "result")]
        public string IttPackage Result{ get; set; }
    }