我正在使用C#和NewtonSoft框架来反序列化json。 JSON来自http://hearthstonejson.com/。 看起来像这样。 http://i.imgur.com/8pmxLYd.png
{"Basic":[
{"id":"GAME_004","name":"AFK","type":"Enchantment","text":"Your turns are shorter."},
{"id":"EX1_066","name":"Acidic Swamp Ooze","type":"Minion","faction":"Alliance","rarity":"Common","cost":2,"attack":3,"health":2,"text":"<b>Battlecry:</b> Destroy your opponent's weapon.","flavor":"Oozes love Flamenco. Don't ask.","artist":"Chris Rahn","collectible":true,"howToGetGold":"Unlocked at Rogue Level 57.","mechanics":["Battlecry"]},
我可以轻松地将一组一次反序列化到我的类中,但不能同时将所有组反序列化。对我来说,我不明白的问题是反序列化器会正确地为每个属性填充一个值,但是如果一个值存在而前面没有要填充的属性会怎么样。
"id":"GAME_004"
将很容易填写
public string id;
但
{"Basic":[{"id":"GAME_004",
(“基本”)或任何其他卡片组名称将不会填写任何内容,除非它具有匹配的属性。我假设我不需要知道卡片名称需要提前做什么。我应该能够将每个集合填充到一个集合中,而不必知道名称或错误?我是否可以不自动将每个对象的开头分配给我的类中的属性,而无需专门知道名称。
Token: StartObject
Token: PropertyName, Value: Basic
Token: StartArray
Token: StartObject
Token: PropertyName, Value: id
Token: String, Value: GAME_004
或者我必须为每个套装做以下事情吗?或者我错过了构建我的课程的一步。
List<IList<Card>> setsList = new List<IList<Card>>();
JObject o = JObject.Parse(readContents2);
JArray a = (JArray)o["Basic"];
setsList.Add(a.ToObject<IList<Card>>());
a = (JArray)o["Debug"];
setsList.Add(a.ToObject<IList<Card>>());
我觉得这样做错了,因为我每次添加一套都要更新它。 下面应该足够(或稍微修改它的形式)来处理json中的所有集合,如果我的类结构正确不应该吗?
using (StreamReader file = File.OpenText("AllSets.json"))
{
JsonSerializer serializer = new JsonSerializer();
List<Card> myCards = (List<Card>)serializer.Deserialize(file, typeof(List<Card>));
}
答案 0 :(得分:0)
尝试反序列化为字符串字典,列表:
var cards = JsonConvert.DeserializeObject<IDictionary<string, IList<Card>>>(readContents2);
或者只是
emp_name1 = captamerica
emp_name2 like ironman
您将拥有一个字典,其中包含一个集合名称作为键,并将卡片作为值。
查看此处的示例:https://dotnetfiddle.net/m3rJYD