如何使用DataContractJsonSerializer来解析嵌套的json对象?
我有一个像这样的json文本:
{ "response":200, "result": { "package": { "token":"aaa" } } }
我正在使用DataContractJsonSerializer从上面的json中提取信息。
public static T Deserialize(string json) { var instance = Activator.CreateInstance(); 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(jsonText); IttPackage package = Deserialize(response.token);
但是,在第一行解析jsonText时总是会出错。
注意:我正在开发一个在C#,VS Ultimate 2013,.Net Framework 4.5编写的桌面上运行的应用程序
所以,我认为,我不能使用System.Web.Helpers或System.Web.Script.Serialization来解析。
序列化引擎了解复杂类型。 一个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);
您可以将IttPackage
包含在IttPackage
对象中,这样您只需解析一次json。 此外,我不认为你可以使用protected
modifier作为属性的set
方法,所以尝试删除它。
[DataContract] class IttResponse { [DataMember(Name = "response")] public int Response { get; set; } [DataMember(Name = "result")] public string IttPackage Result{ get; set; } }