尝试反序列化 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 对象的对象数组