【问题标题】: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 对象数组,其中对象具有数组作为属性。我可以将数组元素映射到类的特定属性吗?
【发布时间】: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# 中以类似的方式反序列化? 我很感谢各种提示和技巧,因为我对编程还比较陌生,只有一年的培训课程。

【问题讨论】:

    标签: c# sql arrays json deserialization


    【解决方案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 功能拉出您需要的卡片,然后根据调用反序列化它

    【讨论】:

      猜你喜欢
      • 2020-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-14
      • 1970-01-01
      相关资源
      最近更新 更多