【发布时间】: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<string, object>看看它是否也会将其他复杂对象解析为字典 -
以下答案适用于 Json.net 并将 json 反序列化为
IDictionary<string,object>stackoverflow.com/a/20728229/5233410 -
@Nkosi 嘿,这是个主意。将其全部解析为
objects,int是,然后我将移动int条目并将其他条目重新解析为项目