使用嵌套对象中的属性反序列化 JSON [重复]

Posted

技术标签:

【中文标题】使用嵌套对象中的属性反序列化 JSON [重复]【英文标题】:Deserializing JSON with a property in a nested object [duplicate] 【发布时间】:2016-02-06 11:10:56 【问题描述】:

如何轻松将此 JSON 反序列化为 OrderDto C# 类?有没有办法以某种方式使用属性来做到这一点?

JSON:


    "ExternalId": "123",
    "Customer": 
        "Name": "John Smith"
    
    ...

C#:

public class OrderDto

    public string ExternalId  get; set; 
    public string CustomerName  get; set; 
    ...

我尝试使用 JsonProperty 属性,但无法使其正常工作。我的想法是写一个注释,如:

[JsonProperty("Customer/Name")]
public string CustomerName  get; set; 

但它似乎不起作用。有任何想法吗?谢谢! :)

【问题讨论】:

【参考方案1】:

你的类应该是这样的:

public class OrderDto

    public string ExternalId  get; set; 
    public Customer Customer  get; set;


public class Customer

    public string CustomerName  get; set; 

未来一个好主意是采用一些现有的 JSON 并使用 http://json2csharp.com/

【讨论】:

指向 json2csharp 的链接非常有用。谢谢!!! 不客气! 这没有回答问题。这个问题意味着在不创建新类的情况下反序列化嵌套对象。 非常有用的评论,谢谢。该问题已经有了答案,因此作为副本关闭。这个答案是为了提供另一种可能的解决方案。【参考方案2】:

您可以创建另一个嵌套其余属性的类,如下所示:

public class OrderDto

    public string ExternalId  get; set; 

    public Customer Customer  get; set; 


public class Customer

    public string Name  get; set; 

这是因为 Name 是 JSON 数据中 Customer 对象的嵌套属性。

[JsonProperty("")] 代码通常在 JSON 名称与您希望在代码中提供的名称不同时使用,即

[JsonProperty("randomJsonName")]
public string ThisIsntTheSameAsTheJson  get; set; 

【讨论】:

那么,除了引入新的类,没有别的办法了吗?我希望我不需要介绍新的...... @bojank 据我所知没有。 C# 端必须复制数据在 JSON 中的表示方式。可以将其转换为字符串的键值对或其他东西,但这可能不是首选。 "Customer": "Name": "John Smith" 是另一个对象,除了为此创建一个新对象之外别无他法。

以上是关于使用嵌套对象中的属性反序列化 JSON [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用嵌套映射的 JSON 对象反序列化,Java Spring

如何将具有嵌套属性的 JSON 对象反序列化为 Symfony 实体?

JSON.net 反序列化对象嵌套数据

如何使用 Newtonsoft.Json 正确反序列化数组中的嵌套对象? [复制]

System.Text.Json 反序列化来自 API 调用的嵌套对象 - 数据包装在父 JSON 属性中

System.Text.Json - 将嵌套对象反序列化为字符串