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

本文关键字:json 对象 嵌套 何使用 DataContractJsonSerializer | 更新日期: 2023-09-27 18:32:25

>我有一个这样的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.HelpersSystem.Web.Script.Serialization来解析。

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

序列化引擎了解复杂类型。一种数据契约类型引用另一种数据契约类型是安全的。

(编辑:我不完全确定是否允许受保护的二传手)

[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);
您可以将

IttPackage包含在IttResposne对象中,以便仅解析一次 json。此外,我认为您不能对属性的set方法使用protected修饰符,因此请尝试将其删除。

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