我试图实现解析 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 框架的一部分,因此您找不到它。
编辑:
- 关于编译,在 Silverlight 中,
DataContractJsonSerializer
位于System.Runtime.Serialization.Json
命名空间中,但在程序集 System.ServiceModel.Web 中(在 System. ServiceModel.Web.dll),这有点令人困惑。因此,您可以像这样使用它 -System.Runtime.Serialization.Json.DataContractJsonSerializer
,但需要额外的程序集引用。您还需要引用 System.Runtime.Serialization 程序集,因为这是定义DataContract
属性的地方。我看到你已经成功地编译了代码,但我希望额外的解释能让 future 的读者更加清楚。 - 关于序列化本身——正如您已经发现的,您将需要两个对象,只是因为这是 json 的结构。但是,
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
方法中。
关于c# - Windows Phone 的 Json 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6561646/