使用newtonsoft反序列化没有属性的值以在类中填充/匹配

时间:2015-06-26 01:06:30

标签: c# json deserialization

我正在使用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>));                
            }

1 个答案:

答案 0 :(得分:0)

尝试反序列化为字符串字典,列表:

var cards = JsonConvert.DeserializeObject<IDictionary<string, IList<Card>>>(readContents2);

或者只是

emp_name1 = captamerica  
emp_name2 like ironman

您将拥有一个字典,其中包含一个集合名称作为键,并将卡片作为值。

查看此处的示例:https://dotnetfiddle.net/m3rJYD