仅反序列化根/特定json对象c#

时间:2018-01-22 17:02:03

标签: c# json object serialization nested

所以我有一个简单的问题。我有一个非常大的json文件,在一个数组中有大约20,000个json对象,并且每个对象中都有3个额外的嵌套对象(彼此分开)。 示例:

    [
  {
    "id": 0,
    "name": "Dwarf remains",
    "exchangeable": false,
    "members": true,
    "placeholder_id": 17851,
    "actions": {
      "inventory": {
        "fourthop": "Destroy"
      },
      "world": {
        "secondop": "Take"
      }
    }
  },

  {
    "id": 1,
    "name": "Toolkit",
    "exchangeable": false,
    "members": true,
    "placeholder_id": 17852,
    "actions": {
      "inventory": {
        "fourthop": "Destroy"
      },
      "world": {
        "secondop": "Take"
      }
    }
  },

  {
    "id": 2,
    "name": "Cannonball",
    "exchangeable": true,
    "members": true,
    "placeholder_id": 17853,
    "values": {
      "value": 5,
      "alchemy_high": 3,
      "alchemy_low": 2
    },
    "actions": {
      "inventory": {
        "fourthop": "Drop"
      },
      "world": {
        "secondop": "Take"
      }
    }
  },

  {
    "id": 3,
    "name": "Nulodion\u0027s notes",
    "exchangeable": false,
    "members": true,
    "placeholder_id": 17854,
    "actions": {
      "inventory": {
        "0": "Read",
        "fourthop": "Destroy"
      },
      "world": {
        "secondop": "Take"
      }
    }
  },

  {
    "id": 4,
    "name": "Ammo mould",
    "exchangeable": false,
    "members": true,
    "placeholder_id": 17855,
    "values": {
      "value": 5,
      "alchemy_high": 3,
      "alchemy_low": 2
    },
    "actions": {
      "inventory": {
        "fourthop": "Drop"
      },
      "world": {
        "secondop": "Take"
      }
    }
  },

  {
    "id": 5,
    "name": "Instruction manual",
    "exchangeable": false,
    "members": true,
    "placeholder_id": 17856,
    "values": {
      "value": 10,
      "alchemy_high": 6,
      "alchemy_low": 4
    },
    "actions": {
      "inventory": {
        "0": "Read",
        "fourthop": "Drop"
      },
      "world": {
        "secondop": "Take"
      }
    }
  },

  {
    "id": 6,
    "name": "Cannon base",
    "exchangeable": true,
    "members": true,
    "noted_id": 7,
    "placeholder_id": 17857,
    "values": {
      "value": 187500,
      "alchemy_high": 112500,
      "alchemy_low": 75000
    },
    "actions": {
      "inventory": {
        "0": "Set-up",
        "fourthop": "Drop"
      },
      "world": {
        "secondop": "Take"
      }
    }
  },

  {
    "id": 8,
    "name": "Cannon stand",
    "exchangeable": true,
    "members": true,
    "noted_id": 9,
    "placeholder_id": 17858,
    "values": {
      "value": 187500,
      "alchemy_high": 112500,
      "alchemy_low": 75000
    },
    "actions": {
      "inventory": {
        "fourthop": "Drop"
      },
      "world": {
        "secondop": "Take"
      }
    }
  }
]

现在,如果我只想反序列化每个项目的根对象:

"id": 8,
"name": "Cannon stand",
"exchangeable": true,
"members": true,
"noted_id": 9,
"placeholder_id": 17858,

(本节) 我是否仍然需要为嵌套在每个项目中的值,操作和世界对象创建另外三个附加类,或者是否有一种方法可以简单地使用类似于只有根对象的类而没有这3个区域并且仍然将它全部反序列化正常?

甚至只是简单地拉项目名称和ID#并将它们放在列表中?我问,因为如果不可能的话,我宁愿不要继续浪费时间。我已经阅读了其他几个主题,但似乎无法找到这个特定实例的明确指示。 其他线程和文章/教程我读过有关反序列化嵌套json对象的内容,往往是在谈论一个不是数组的json字符串,它们只希望获取单个元素,或者嵌套是以不同方式完成的。

这可能吗?如果是这样,你可以简单地给我一个小指针或链接到可以解释这种想法的东西。没有必要超级深入,只是真的需要有人指出方向,所以我可以更容易找到它。我现在几个小时都在搜索线程而没有运气。

另外一个问题是,存储项目名称和ID号(数据库除外)的最佳方法是什么,以便用户可以使用自动完成功能在文本框/组合框中搜索项目名称,并且一旦项目为选中它将使用相应的ID号在另一个api中搜索该号码。

是否有任何不错的方法可以做到这一点,还是应该坚持我原先的想法,只需将这个json数组导入数据集,然后将其保存为xml,然后在启动时将xml导入数据集?

我宁愿避免这种情况,而不是用户需要不断检查xml文件的新版本,他们可以简单地在每次启动时获取最新的json并使用它。这样我只需要担心更改api上的文件。

注意:我试图确保这不是一个重复的帖子,并查看几个线程无济于事。但是,我只睡了几个小时,我完全有可能弄错了。  如果我这样做,这是一个重复的帖子,请告诉我,如果是的话我会提前道歉。我现在尽力而为,确保我没有复制一个帖子。

2 个答案:

答案 0 :(得分:2)

您可以忽略不希望反序列化的属性,也可以从目标类中删除该属性。

public class Inventory
{
    public string fourthop { get; set; }
}

public class World
{
    public string secondop { get; set; }
}

public class Actions
{
    public Inventory inventory { get; set; }
    public World world { get; set; }
}

public class RootObject
{
    public int id { get; set; }
    public string name { get; set; }
    public bool exchangeable { get; set; }
    public bool members { get; set; }
    public int placeholder_id { get; set; }
    [JsonIgnore]//Ignore deserialization
    public Actions actions { get; set; }
}

var result = JsonConvert.DeserializeObject<List<RootObject>>(json);

答案 1 :(得分:0)

“有没有办法简单地使用一个类似于没有这3个区域的根对象的类,并且仍然可以正确反序列化?”

是的,您可以直接将列表反序列化到列表中:这是一个示例:

    If dataGridView3.CurrentRow.IsNewRow = True then
        If Len(dataGridView3.SelectedRows(0).Cells(3)) = 7 Then
            dataGridView3.SelectedRows(0).Cells(4).Value = "Surprise"
        End If
    End If

输出:

enter image description here