gpt4 book ai didi

c# - JSON Deserialization Despair(无法反序列化嵌套类型)

转载 作者:行者123 更新时间:2023-11-30 17:53:35 26 4
gpt4 key购买 nike

SO 上可能有 500 个这样的问题,还有一百万个网站都提供了一些信息 - 但我就是只见树木不见森林。这看起来应该非常简单,但我就是做不到。

我有一个返回序列化 JSON 对象的 WCF 网络服务:

[OperationContract(Name = "PeopleData"), WebGet(BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "people/{subset}", ResponseFormat = WebMessageFormat.Json)]
PeopleObject GetPeople(string subset);

这有效 - 如果我从浏览器中点击该 URI,将调用 GetPeople 并返回一个 JSON 序列化的 PeopleObject(此处为保护隐私而编辑的实际数据值):

{"HashValue":"XXXXX","People":[{"EmailAddress":"XXXXX","EmployeeID":99999,"Gender":"X","JobTitle":"XXXXX","Office":"","PreferredName":"XXXXX","Surname":"XXXXX","WorkExtensionNumber":"XXXXX","WorkPhoneNumber":"XXXXX","Department":"XXXXX","DeskNumber":"XXXXX","EmploymentClassification":"XXXXX","InternationalExtensionNumber":"XXXXX","IsFirstAider":false,"Languages":[{"LanguageID":9,"LanguageSkillID":9},{"LanguageID":9,"LanguageSkillID":9}],"QualificationInitials":"XXXXX","QualificationTitle":"XXXXX","Secretaries":null,"WorkMobilePhoneNumber":"XXXXX"}],"RecordCount":"1","SizeBytes":"12345"}

在此示例中,PeopleObject 有效负载仅包含集合中的一个 Person 对象,但可以包含多个(取决于 /{subset} 中提供的参数

这是 PeopleObject 的类层次结构 - 它是一个顶层容器,包含一些关于负载的元数据,以及 Person 对象的 List<>。这些对象又具有一堆简单的类型属性,加上两个进一步嵌套的 List<> 的 LanguageSecretary 对象(可能填充也可能不填充):

  [DataContract]
public class PeopleObject
{
[DataMember]
public string HashValue { get; set; }
[DataMember]
public List<Person> People { get; set; }
[DataMember]
public string RecordCount { get; set; }
[DataMember]
public string SizeBytes { get; set; }
}

[DataContract]
public class Person
{
[DataMember]
public string EmailAddress { get; set; }
// <-- snip - lots of fields like this, no point listing them all here
[DataMember]
public bool IsFirstAider { get; set; }
[DataMember]
public List<Language> Languages { get; set; }
[DataMember]
public List<Secretary> Secretaries { get; set; }
}

[DataContract]
public class Language
{
[DataMember]
public int LanguageID { get; set; }
[DataMember]
public int LanguageSkillID { get; set; }
}

[DataContract]
public class Secretary
{
[DataMember]
public int EmployeeID { get; set; }
[DataMember]
public char FirstSurnameLetter { get; set; }
}

到目前为止一切顺利 - WCF 使用包含所有字段及其内容的 JSON 结构进行响应。现在在客户端应用程序中反序列化该结构(使用相同的类层次结构定义):

  // I have a little helper-class to manage the WCF request and return a Stream
using (Stream response = wcfHelper.GetRequestResponseStream(MY_WCF_URI))
{
// This is debug code to prove the response arrives as expected - it does
//StreamReader sr = new StreamReader(response);
//Console.WriteLine("\nResponse:\n{0}", sr.ReadToEnd());

// Deserialise the response
DataContractJsonSerializer dc = new DataContractJsonSerializer(typeof(PeopleObject));
PeopleObject p = (PeopleObject)dc.ReadObject(response);

// The object shows 1 record (in the example) but nothing in the List<>
Console.WriteLine("\nDeserialized records: '{0}' [{1}]", p.RecordCount, p.People.Count);
}

因此,这正确地反序列化了容器对象,为我提供了以字节为单位的记录计数、哈希值和负载大小。该对象确实也有一个 Person 对象的 List<>,但它是 null - 来自 JSON 响应的内容尚未通过创建和添加 Person 对象成功地重新水合 List<>。

我错过了什么?我的理解是,这种从 JSON 结构对 C# 对象层次结构的再水化应该自动发生,所以要么不是这种情况(我需要编写一些代码来实现它)要么是,但我错过了一些明显的事情。

最佳答案

我之前没有做过你正在做的事情,但从 documentation 判断,我假设以下方法可行:

List<Type> types = new List<Type>();
types.Add(typeof(Person));
types.Add(typeof(Language));
types.Add(typeof(Secretary));

DataContractJsonSerializer dc = new DataContractJsonSerializer(typeof(PeopleObject), types);
PeopleObject p = (PeopleObject)dc.ReadObject(response);

您基本上需要告诉 Serializer 在序列化/反序列化您的对象时可能遇到的所有类型。

关于c# - JSON Deserialization Despair(无法反序列化嵌套类型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17214092/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com