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