我需要解析一个结构如下的jsonfile:
"number": {
"1": {
"branch": null,
"build": 1,
"files": [
[
"zip",
"client",
"4d96d6e8f1543c5fa1184f4771ce16e2"
],
[
"zip",
"src",
"fd397591148fac49a7d57aafdccac6a3"
],
[
"zip",
"server",
"d7e1df9a91ded33be81ee8226b027c2f"
],
[
"txt",
"changelog",
"df98aec1a868ce99532c64f246387d55"
]
],
"jobver": "1.3.2",
"mcversion": "1.1",
"modified": 1328269373.0,
"version": "1.3.2.01"
},
"2": {
"branch": null,
"build": 2,
"files": [
[
"zip",
"server",
"80fbd5d837a5867c2dd7b7967e3aa2a9"
],
[
"zip",
"client",
"0cedb5e9844e490f877b6cf04601f929"
],
[
"txt",
"changelog",
"87e9fba9322e9dbc2ea482a2c3edeec6"
],
[
"zip",
"src",
"292d5596879bd13c159a2afe571ec5eb"
]
],
"jobver": "1.3.2",
"mcversion": "1.1",
"modified": 1328613907.0,
"version": "1.3.2.2"
}
(整个json文件可以在这里找到:http://files.minecraftforge.net/maven/net/minecraftforge/forge/json)
我已经找到了内部,在“1”和导致这个代码部分的外部,但是使用Json.NET库我无法弄清楚如何处理“1”和“2”而不写每个人都有一个单独的班级。我有超过1000个解析槽,所以我需要一些方法可以做到相对简单。
我目前的解析类看起来像这样:
public class forgemaven
{
public string homepage { get; set; }
public string name { get; set; }
public List<Number> number { get; set; }
public string webpath { get; set; }
}
public class Number
{
public string branch { get; set; }
public int build { get; set; }
public List<String> files { get; set; }
public string jobver { get; set; }
public string mcversion { get; set; }
public string modified { get; set; }
public string version { get; set; }
}
注意:我删除了一些东西,比如前1000行版本/ build,因为它们不需要,json.net看起来很好。
我试图用http://json2csharp.com/解析它,遗憾的是崩溃了我的webbrowser。我也尝试了它的桌面版本,但这给了我几乎MB的类,这也不是最佳的,因为新版本不断添加到这个文件中,所以我必须一直改变我的结构,它使用这里的数据会很可怕。
所以对于我的问题:我如何以可维护的方式做到这一点?
答案 0 :(得分:1)
你的问题是{"1" : something, "2" ; something}
不是json数组,它是json地图。
在.net中,您需要将其反序列化为Dictionary<int,TObject>
。然后你可以在事后处理它,如果它真的应该是一个`List&#39;或者数组,但是在反序列化时你不能这样做:你首先得到了糟糕的json,你必须处理它。
这是一个小提示,展示了这个东西(你给的json和你自己的类只有非常轻微的修改:files
属性是List<List<string>>
而不是List<String>
)使用Json .Net:https://dotnetfiddle.net/feqFZd
答案 1 :(得分:0)
您必须替换
public List<Number> number { get; set; }
与
public Dictionary<int,Number> number { get; set; }