尝试反序列化 JSON 对象数组,其中对象具有数组作为属性。我可以将数组元素映射到类的特定属性吗?

Posted

技术标签:

【中文标题】尝试反序列化 JSON 对象数组,其中对象具有数组作为属性。我可以将数组元素映射到类的特定属性吗?【英文标题】:Trying to deserialize JSON object array where the objects have arrays as properties. Can I map the array elements to specific properties of a class? 【发布时间】:2021-06-26 09:26:07 【问题描述】:

我将一个 json 文件反序列化为 C# 对象,在本例中为 MTG 卡(来自 scryfall.com 的 json)。以前我用 MSSQL 解决了这个问题;我使用 OPENJSON 将 json 数据导入数据库,将我需要的每个元素映射到具有正确名称的列,然后创建一个新的 json 文件,其属性与我在应用程序中所需的类匹配。 对于像 arena_id 这样只有一个值的属性,或者对于用作字符串 (color_identity) 的数组,这不是问题,但是对于像 card_faces(有 2 个可玩面的卡片)这样的数组,我必须指定我要导入的数组。

    arena_id int                                 '$.arena_id',
...
    [color_identity]                              nvarchar(max) AS JSON,
...
    name_front varchar(100)                      '$.card_faces[0].name',
    mana_cost_front varchar(30)                  '$.card_faces[0].mana_cost',
    name_back varchar(100)                       '$.card_faces[1].name',
    mana_cost_back varchar(30)                   '$.card_faces[1].mana_cost',

从定制的 SQL 文件中,我相应地反序列化了每个对象,但现在我尝试在没有 SQL 的情况下执行此操作,并且更直接地影响去往何处。 如前所述,对于不需要解构的属性,我知道我可以在类中选择相同的属性名称,并且很容易被接受。我的问题是数组属性,我应该将其划分为具有不同名称的单独属性。 是否可以在 C# 中以类似的方式反序列化? 我很感谢各种提示和技巧,因为我对编程还比较陌生,只有一年的培训课程。

【问题讨论】:

【参考方案1】:

您只需要创建一个正确表示预期 JSON 格式的类,EG:

public class MyClass

    public int Arena_Id  get; set; 
    public CardFace[] Card_Faces  get; set; 


public class CardFace

    public string Name  get; set; 
    public string Mana_Cost  get; set; 

然后反序列化您的 JSON:

string json = ... // your data

MyClass x = new Newtonsoft.Json.JsonSerializer() // or whichever serializer you want
    .DeSerialize<MyClass>(json)

使用您的类的这个反序列化实例,您可以将其转换为与您需要的结构匹配的另一个类。

【讨论】:

是的,我想这是一个可行的选择。谢谢,我正在尝试,会通知您! 感谢您的帮助!我设法将文件反序列化为对象,现在我只需要转换它们!【参考方案2】:

我猜你至少可以调用 JSON。 C# 确实有一个很好的 JSON 反序列化指令。

// keep the class as close to how it will show up on the JSON 
public class MTGCard

    public string name;
    public int manaCost;
    ...

// then you should be able to just 
currentCard = JsonSerializer.Deserialize<MTGCard>(jsonString);

类和 json 足够接近,您应该能够简单地使用 Array 功能拉出您需要的卡片,然后根据调用反序列化它

【讨论】:

以上是关于尝试反序列化 JSON 对象数组,其中对象具有数组作为属性。我可以将数组元素映射到类的特定属性吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Newtonsoft 反序列化未命名数组的 JSON 数组

如何使用 Jackson 反序列化来自 json 对象的对象数组

使用空白数组反序列化 JSON 对象

C# JSON 反序列化:如何从 JSON 对象数组中获取值 [重复]

使用 Json.net 反序列化 JSON 对象数组

无法将 JSON 数组反序列化为 C# 对象 [关闭]