将ASP.net web服务中的JSON反序列化为C#对象
在花了一天的时间阅读了这里的帖子之后,我仍然无法让它发挥作用,所以希望这对这里的人来说是有意义的 web服务返回这个简单的JSON将ASP.net web服务中的JSON反序列化为C#对象,c#,asp.net,json,C#,Asp.net,Json,在花了一天的时间阅读了这里的帖子之后,我仍然无法让它发挥作用,所以希望这对这里的人来说是有意义的 web服务返回这个简单的JSON {"d":{"__type":"TestWebServices.Person","Name":"Bob","FavoriteColor":"Green","ID":0}} 然后我使用C代码进行反序列化 DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(
{"d":{"__type":"TestWebServices.Person","Name":"Bob","FavoriteColor":"Green","ID":0}}
然后我使用C代码进行反序列化
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(Person));
Person someone = (Person)jsonSerializer.ReadObject(responseStream);
当我使用这个模型时,有人被创建了,但是所有的属性都是空的
[DataContract]
public class Person {
[DataMember]
public string Name { get; set; }
[DataMember]
public string FavoriteColor { get; set; }
[DataMember]
public int ID { get; set; }
}
我试着更直截了当地使用这个模型
[DataContract]
public class Person {
[DataMember]
public PersonItem d { get; set; }
}
[DataContract]
public class PersonItem {
[DataMember]
public string __Type { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public string FavoriteColor { get; set; }
[DataMember]
public int ID { get; set; }
}
我犯了这个错误,我甚至不知道从哪里开始
元素“:d”包含来自映射到名称“:GEMiniWebServices.Person”的类型的数据。反序列化程序不知道映射到此名称的任何类型。考虑使用DATACONTractRelver或将“TestWebServices”对应的类型添加到已知类型的列表中,例如,使用NoNyType属性或将其添加到已知的类型传递到DATACONTROTTRORIGALALZER的列表中。
有什么想法吗?
谢谢尝试添加(我在这里有点冒险,所以我的确切名称空间可能不正确)
到您的个人数据契约属性
[DataContract(Namespace = "http://schemas.datacontract.org/2004/07/TestWebServices.Person")]
public class Person {
[DataMember]
public PersonItem d { get; set; }
}
[DataContract]
public class PersonItem {
[DataMember]
public string __Type { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public string FavoriteColor { get; set; }
[DataMember]
public int ID { get; set; }
}
__类型不应该是对象的一部分。这是对序列化程序的提示。此外,JSON对象中的类型提示是错误的。说: 要保留类型标识,将复杂类型序列化为JSON时 可以添加“类型提示”,反序列化程序识别提示和 行动得体。“类型提示”是带有 “类型”的关键字名称(两个下划线,后跟单词“类型”)。 该值是JSON字符串的形式 “DataContractName:DataContractNamespace”(第一个 冒号是名称) 类型提示与 XML模式实例标准,在序列化/反序列化时使用 XML 由于潜在冲突,名为“_类型”的数据成员被禁止 使用类型提示 如果您将
类型
声明重写为Person:#TestWebServices
或将其删除,则它可以与以下内容一起工作:
namespace TestWebServices
{
[KnownType(typeof(Person))]
[DataContract]
public class PersonWrapper
{
[DataMember]
public Person d { get; set; }
}
[DataContract]
public class Person
{
[DataMember]
public string Name { get; set; }
[DataMember]
public string FavoriteColor { get; set; }
[DataMember]
public int ID { get; set; }
}
}
如果您添加
服务引用
,生成的客户端将为您反序列化响应。感谢您提供的信息。我也尝试过不使用“\uuuu类型”的方法,但得到了相同的错误。web服务正在创建那个类型提示,不确定我能做什么。添加了注释-如果我从JSON中去掉“d”:{“\uuu type”:“GEMiniWebServices.Person”,DataContractJsonSerializer和JavaScriptSerializer都可以将数据解析到Personim对象中,“d”:{“\uu type”的目的也是如此:“?这显然使一些简单的事情变得复杂。想法?这里描述了这个问题。文章建议去掉导致问题的json。如果您将\uuuu type
声明重写为Person:#TestWebServices
或将其删除,它就会起作用。以下是与“d”的“目的”相关的内容:{。
namespace TestWebServices
{
[KnownType(typeof(Person))]
[DataContract]
public class PersonWrapper
{
[DataMember]
public Person d { get; set; }
}
[DataContract]
public class Person
{
[DataMember]
public string Name { get; set; }
[DataMember]
public string FavoriteColor { get; set; }
[DataMember]
public int ID { get; set; }
}
}