繁体   English   中英

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

[英]How to use DataContractJsonSerializer to parse a nested json object?

我有一个像这样的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来解析。

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

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

[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);

您可以包括你的IttPackageIttResposne对象,这样你就只解析JSON一次。 此外,我不认为你可以使用protected modifier作为属性的set方法,所以尝试删除它。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM