c# - Windows Phone 的 Json 序列化

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

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

我有使用 System.Runtime.Serialization 的导入; 使用 System.Runtime.Serialization.Json;我不确定我缺少什么重要内容。我试图包括 using System.ServiceModel.Web;但无法识别 Web 部分。

我认为我的项目没有指向来自 here 的正确框架.但是在Assembly信息中,没有让我更改目标框架的选项。

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

谁能帮我让这个 JSON 东西在 Windows Phone 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;
       }
   }

反序列化响应后出现此错误: servicename 无法计算表达式字符串

(我无法导入 System.ServiceModel.Web,尽管我在引用中有 dll。.Web 部件上的编译错误(命名空间“System.ServiceModel”中不存在类型或命名空间名称“Web” ) )

编辑 经过更多研究,我发现在调试器中查看时我的响应实际上是 { \"服务响应\":{ \"servicename\":\"RequestRegisterUser\",..... 我搜索了这个,发现这可能是个问题。我如何格式化它以更正 JSON 字符串??

最佳答案

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

顺便说一下,JSON.NET 是一种流行的 .Net 开源 JSON 框架,您可以找到更多相关信息 here .它不是 .Net 框架的一部分,因此您找不到它。

编辑:

  1. 关于编译,在 Silverlight 中,DataContractJsonSerializer 位于 System.Runtime.Serialization.Json 命名空间中,但在程序集 System.ServiceModel.Web 中(在 System. ServiceModel.Web.dll),这有点令人困惑。因此,您可以像这样使用它 - System.Runtime.Serialization.Json.DataContractJsonSerializer,但需要额外的程序集引用。您还需要引用 System.Runtime.Serialization 程序集,因为这是定义 DataContract 属性的地方。我看到你已经成功地编译了代码,但我希望额外的解释能让 future 的读者更加清楚。
  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 方法中。

关于c# - Windows Phone 的 Json 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6561646/

相关文章:

c# - 何时覆盖页面生命周期中的验证方法

c# - 为什么用 .net 代码更新 cshtml 文件时不需要编译?

ios - 如何使用 curl 发布 JSON 数据并在 RoR 中使用它?

javascript - 如何重新排列对象的属性?

c# - 来自委托(delegate)的 PropertyInfo

c# - 以下关系的实体设计建议

java - 尝试解析 JSON 数据时出现此错误 W/System.err : org. json.JSONException:对客户没有值(value)

xml - Windows Phone 7 xml linq 查询麻烦

windows-phone-7 - 如何将 Windows Phone 设备与 Arduino 连接?

windows-phone-7 - 周期性任务没有被执行