适用于Windows Phone的Json序列化

本文关键字:Json 序列化 Phone Windows 适用于 | 更新日期: 2023-09-27 18:00:54

我试图实现解析JSON响应,如这里所示,用于我的Windows Phone 7 C#项目。但我遇到了一个编译错误,因为"找不到类型或命名空间名称"Serializable"(您是否缺少using指令或程序集引用?(">

我使用System.Runtime.Serialization进行导入;使用System.Runtime.Serialization.Json;我不确定我缺少什么重要的东西。我尝试使用System.ServiceModel.Web;但是Web部分未被识别。

我认为我的项目没有指向正确的框架。但在大会的信息中,我没有改变目标框架的选择。

这看起来和我的问题类似,但我在为Windows Phone筛选的.NET dll中找不到JSON.NET。

有人能帮我把这个JSON的东西用在WindowsPhone7上吗。

提前感谢。

编辑-2011年7月3日

我的Jason回应是{"serviceresponse":{"servicesname":"RequestRegisterUser",….

我的响应对象是:

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

现在,我在反序列化响应后收到以下错误:servicename无法计算表达式字符串

(尽管引用中有dll,但我无法导入System.ServiceModel.Web。.Web部分出现编译错误(命名空间"System.ServiceModel"中不存在类型或命名空间名称"Web"(

EDIT经过更多的研究,我发现在调试器中查看时我的响应实际上是{''"serviceresponse''":{''"servicename''":''"RequestRegisterUser''",。。。。。我搜索了一下,发现这可能是个问题。如何将其格式化为正确的JSON字符串??

适用于Windows Phone的Json序列化

您需要添加对System.Runtime.Serialization和System.ServiceModel.Web程序集的引用。DataContractJsonSerializer是在框架的Silverlight版本中的System.ServiceModel.Web程序集中定义的,这就是为什么需要额外的程序集引用。

顺便说一句,JSON.NET是一个流行的.NET开源JSON框架,您可以在这里找到更多关于它的信息。它不是.Net框架的一部分,这就是你找不到它的原因。

编辑:

  1. 关于编译,在Silverlight中,DataContractJsonSerializerSystem.Runtime.Serialization.Json命名空间中,但在程序集System.ServiceModel.Web(在System.ServiceModel.Web.dll中(中,这有点令人困惑。所以您像这样使用它-System.Runtime.Serialization.Json.DataContractJsonSerializer,但需要额外的程序集引用。您还需要引用System.Runtime.Serialization程序集,因为这是定义DataContract属性的地方。我知道你已经成功地编译了代码,但我希望额外的解释能让未来的读者更清楚
  2. 关于序列化本身——正如您已经发现的,您将需要两个对象,因为这是json的结构。但是,DataContractDataMember属性有一个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; }
    ...
}

但这是两个序列化概念的混合,其中一个在Phone7中不受支持。正确的属性是DataContractDataMember:

[DataContract]
public class Response
{
    [DataMember]
    public string name { get; set; }
    ...
}

我发现了这个问题。虽然我的类名是"serviceresponse",但我使用了另一个包装类

public class Response
{
   public serviceresponse serviceres;//Don't Do this....
}

其中,我将serviceresponse的变量名用作serviceres。但当我把它改为"serviceresponse"时,一切都正常了。

public class Response
{
   public serviceresponse serviceresponse;//This fixed it.
}