[英]Json Serialization for Windows Phone
我试图在 C# 中为我的 Windows Phone 7 项目实现解析 JSON 响应,如此处所示。 但是我遇到了一个编译错误,因为“找不到类型或命名空间名称'Serializable'(您是否缺少 using 指令或程序集引用?)”
我使用 System.Runtime.Serialization 导入; 使用 System.Runtime.Serialization.Json; 我不确定我缺少什么进口。 我试图包括使用 System.ServiceModel.Web; 但是 Web 部分无法识别。
我认为我的项目没有从这里指向正确的框架。 但是在大会信息中,我没有更改目标框架的选项。
这看起来与我的问题相似,但我在 .net dll 中找不到 JSON.NET,它为 Windows 电话过滤。
有人可以帮我把这个 JSON 的东西用于 Windows 电话 7。
预先感谢。
编辑 - 2011 年 7 月 3 日
我的杰森响应是 { "serviceresponse": { "servicename": "RequestRegisterUser", .....
我的 Response 对象是:
[DataContract]
public class serviceresponse
{
[DataMember]
public String servicename { get; set; }
.
.
.
还有我的反序列化方法:
public static T Deserialise<T>(string json)
{
T obj = Activator.CreateInstance<T>();
using (MemoryStream stream = new MemoryStream(Encoding.Unicode.GetBytes(json)))
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
obj = (T)serializer.ReadObject(stream);
return obj;
}
}
现在我在反序列化响应后收到此错误:服务名称无法评估表达式字符串
(我无法导入 System.ServiceModel.Web 虽然我在参考中有 dll。在.Web 部分的编译错误(类型或名称空间名称的Web 不存在)
编辑经过更多研究,我发现在调试器中查看时我的响应实际上是 { \"serviceresponse\": { \"servicename\": \"RequestRegisterUser\",..... 我搜索了这个,发现这可能是一个问题。 如何格式化它以更正 JSON 字符串?
您需要添加对 System.Runtime.Serialization 和 System.ServiceModel.Web 程序集的引用。 DataContractJsonSerializer
在框架的 Silverlight 版本的 System.ServiceModel.Web 程序集中定义,这就是您需要额外程序集引用的原因。
顺便说一句,JSON.NET 是一个流行的开源 JSON 框架,适用于 .Net,您可以在此处找到更多相关信息。 它不是 .Net 框架的一部分,这就是你找不到它的原因。
编辑:
DataContractJsonSerializer
is in the System.Runtime.Serialization.Json
namespace, but in the assembly System.ServiceModel.Web (in System.ServiceModel.Web.dll), which is a bit confusing. 所以你像这样使用它 - System.Runtime.Serialization.Json.DataContractJsonSerializer
,但需要额外的程序集引用。 您还需要引用 System.Runtime.Serialization 程序集,因为这是定义DataContract
属性的地方。 我看到你已经成功编译了代码,但我希望额外的解释能让未来的读者更清楚。DataContract
和DataMember
特性有一个Name
属性,您可以使用它来代替更改字段的名称。 此外,如果您愿意,可以使用属性而不是字段。例如:
[DataContract]
public class ServiceResponse
{
[DataMember(Name = "servicename")]
public string ServiceName { get; set; }
}
[DataContract]
class Response
{
[DataMember(Name = "serviceresponse")]
public ServiceResponse ServiceResponse { get; set; }
}
最后一件事 - 你不需要调用 Activator.CreateInstance(); 在您的Deserialise
方法中。
如果您发布代码肯定会有所帮助。 所以我只能猜测:
我假设你有这样的事情:
[Serializable]
public class Response
{
[DataMember]
public string name { get; set; }
...
}
但这是两个序列化概念的混合,其中一个在 Phone 7 中不受支持。正确的属性是DataContract和DataMember :
[DataContract]
public class Response
{
[DataMember]
public string name { get; set; }
...
}
我发现了这个问题。 虽然我的 class 名称是“serviceresponse”,但我使用了另一个包装器 class 作为
public class Response
{
public serviceresponse serviceres;//Don't Do this....
}
我将 serviceresponse 的变量名称用作 serviceres。 但是,当我将其更改为“服务响应”时,它一切正常。
public class Response
{
public serviceresponse serviceresponse;//This fixed it.
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.