【问题标题】:cant figure out how to map this json into C# classes无法弄清楚如何将 json 映射到 C# 类中
【发布时间】:2016-04-10 03:34:19
【问题描述】:

所以我有下面的 json,我想将其反序列化为类,以便我可以使用它。但问题是前两个字段的类型与其他字段不同

"items": {
    "averageItemLevel": 718,
    "averageItemLevelEquipped": 716,
    "head": { ... },
    "chest": { ... },
    "feet": { ... },
    "hands": { ... }
    }

其中...是下面的Item类,但问题是其中2个字段是int,其余是Item,总共大约有20个字段。所以我想做的是将它们放入Dictionary<string, Item>,但 2 个 int 字段阻止我将其反序列化。我正在使用JavaScriptSerializer.Deserialize<T>() 来执行此操作。

我可以将每个项目作为它自己的类,并将项目名称作为类的名称,但我发现这很糟糕,每次都重复这么多,以后也很难处理,因为我不能遍历字段,我可以使用Dictionary。知道如何克服这个问题吗?

public class Item
{
    public ItemDetails itemDetails { get; set; }
    public int id { get; set; }
    public string name { get; set; }
    public string icon { get; set; }
    public int quality { get; set; }
    public int itemLevel { get; set; }
    public TooltipParams tooltipParams { get; set; }
    public List<Stat> stats { get; set; }
    public int armor { get; set; }
    public string context { get; set; }
    public List<int> bonusLists { get; set; }
}

更新:从 cmets 我想出了这个解决方案

JObject jsonObject = JObject.Parse(json);

jsonObject["averageItemLevel"] = int.Parse(jsonObject["items"]["averageItemLevel"].ToString());
jsonObject["averageItemLevelEquipped"] = int.Parse(jsonObject["items"]["averageItemLevelEquipped"].ToString());
jsonObject["items"]["averageItemLevel"].Parent.Remove();
jsonObject["items"]["averageItemLevelEquipped"].Parent.Remove();

var finalJson = jsonObject.ToString(Newtonsoft.Json.Formatting.None);
var character = _serializer.Deserialize<Character>(finalJson);
character.progression.raids.RemoveAll(x => x.name != "My House");

return character

【问题讨论】:

  • 如果您要使用类路径,可以使用一些工具,您只需将其粘贴到 json 中,它就会为您生成类。这是一个这样的工具:jsonutils.com
  • @Nkosi 是的,我知道这类工具,尽管它们很棒,但正如我所提到的,它们只会为每个 Item 创建一个类,这使得它相当混乱且难以使用数据
  • 好的,我明白了。你可以试试Dictionary&lt;string, object&gt; 看看它是否也会将其他复杂对象解析为字典
  • 以下答案适用于 Json.net 并将 json 反序列化为 IDictionary&lt;string,object&gt; stackoverflow.com/a/20728229/5233410
  • @Nkosi 嘿,这是个主意。将其全部解析为objectsint 是,然后我将移动int 条目并将其他条目重新解析为项目

标签: c# json


【解决方案1】:

如果我添加这两个类以匹配您的 JSON,我可以序列化和反序列化对象:

public class root
{
    public Items items { get; set; }
}

public class Items
{
    public int averageItemLevel { get; set; }
    public int averageItemLevelEquipped { get; set; }
    public Item head {get;set;}
    public Item chest {get;set;}
    public Item feet {get;set;}
    public Item hands {get;set;}
}

使用 WCF 序列化程序的测试台:

var obj = new root();
obj.items = new Items
{
    averageItemLevel = 42,
    feet = new Item { armor = 4242 },
    chest = new Item { name = "super chest" }
};

var ser = new DataContractJsonSerializer(typeof(root));

using (var ms = new MemoryStream())
{
    ser.WriteObject(ms, obj);

    Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray()));
    Console.WriteLine("and deserialize");

    ms.Position = 0;
    var deserializeObject = (root) ser.ReadObject(ms);

    Console.WriteLine(deserializeObject.items.feet.armor);
}

并且使用 JavaScriptSerializer:

var jsser = new JavaScriptSerializer();
var json = jsser.Serialize(obj);

Console.WriteLine(json);
Console.WriteLine("and deserialize");

var djson = jsser.Deserialize<root>(json);

Console.WriteLine(djson.items.feet.armor);

对于给定的 JSON,两个序列化程序给出相同的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 2014-12-18
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多