【问题标题】:Json Serialization for Windows PhoneWindows Phone 的 Json 序列化
【发布时间】:2011-07-03 07:25:36
【问题描述】:

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

我使用 System.Runtime.Serialization 进行导入; 使用 System.Runtime.Serialization.Json;我不确定我缺少什么进口。我试图包括使用 System.ServiceModel.Web;但无法识别 Web 部件。

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

This 看起来与我的问题类似,但我在为 Windows Phone 过滤的 .net dll 中找不到 JSON.NET。

谁能帮我让这个 JSON 东西在 Windows Phone 7 上工作。

提前致谢。

编辑 - 2011 年 7 月 3 日

我的杰森回应是 { "serviceresponse" : { "servicename" : "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 经过更多研究,我发现我在调试器中查看时的响应实际上是 { \"服务响应\": { \"服务名称\": \"RequestRegisterUser\",..... 我搜索了这个,发现这可能是一个问题。如何格式化它以更正 JSON 字符串??

【问题讨论】:

  • 你能发布没有编译的代码吗?

标签: c# json windows-phone-7 windows-phone deserialization


【解决方案1】:

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

顺便说一下,JSON.NET 是一个流行的 .Net 开源 JSON 框架,您可以在here 找到更多相关信息。它不是 .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 方法中。

【讨论】:

  • 谢谢。这解释了 Json.net。我已经发布了我的源代码。尽管我在参考中有 dll,但我无法导入 System.ServiceModel.Web。 .Web 部件上的编译错误(命名空间“System.ServiceModel”中不存在类型或命名空间名称“Web”)
【解决方案2】:

如果您发布代码肯定会有所帮助。所以我只能猜测:

我假设你有这样的东西:

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

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

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

【讨论】:

  • 谢谢。现在我已经添加了我的源代码,这与您的回复类似。现在可以再拍一张吗?
【解决方案3】:

我发现了问题。虽然我的类名是“serviceresponse”,但我使用了另一个包装类作为

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

我将 serviceresponse 的变量名称用作 serviceres。但是当我把它改成“serviceresponse”时,它就一切正常了。

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

【讨论】:

    猜你喜欢
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多