繁体   English   中英

Json 序列化 Windows 电话

[英]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 框架的一部分,这就是你找不到它的原因。

编辑:

  1. About the compilation, in Silverlight the 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属性的地方。 我看到你已经成功编译了代码,但我希望额外的解释能让未来的读者更清楚。
  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; }
    ...
}

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

[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.

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