Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将ASP.net web服务中的JSON反序列化为C#对象_C#_Asp.net_Json - Fatal编程技术网

将ASP.net web服务中的JSON反序列化为C#对象

将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(

在花了一天的时间阅读了这里的帖子之后,我仍然无法让它发挥作用,所以希望这对这里的人来说是有意义的

web服务返回这个简单的JSON

{"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; }
    }
}