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

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?

我正在将 json 文件反序列化为 C# 对象,在本例中为 MTG 卡(json 来自 scryfall.com)。以前我用 MSSQL; 解决了这个问题。我使用 OPENJSON 将 json 数据导入数据库,将我需要的每个元素映射到具有适当名称的列,然后创建一个新的 json 文件,其属性与我需要的 class 相匹配在应用程序中。 对于像 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 的情况下进行反序列化,并且更直接地影响到什么地方。 如前所述,对于不需要解构的属性,我知道我可以在 class 中选择相同的 属性 名称,它很容易被接受。我的问题是数组属性,我应该将它们分成具有不同名称的单独属性。 在 C# 中是否有可能以类似的方式反序列化? 我很感谢各种提示和技巧,因为我对编程还比较陌生,只参加了一年的培训课程。

我猜您至少可以调用 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);

class 和 json 足够接近,您应该能够简单地使用 Array 功能拉出您需要的卡片,然后在基于

的调用中反序列化它

您只需创建一个 class 来正确表示预期的 JSON 格式,例如:

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)

有了这个反序列化的 class 实例,您就可以将它翻译成另一个 class 匹配您需要的结构。