【发布时间】:2020-07-04 03:38:02
【问题描述】:
我有以下 JSON 文件,但在解析时遇到问题。
{
"version": 2,
"versioned_files": [
{
"DB": [
"Table0",
[
{
"version": 0,
"fields": [
{
"name": "key",
"type": "StringU8"
},
{
"name": "value",
"type": "Float"
}
],
"localised": []
}
]
]
},
{
"NoDbObject": [
{
"version": 1,
"fields": [
{
"name": "objectProp",
"type": "StringU8"
}
],
"localised": []
}
]
}
]
}
https://json2csharp.com/为我生成以下代码,帮助不大:
// Root myDeserializedClass = JsonConvert.DeserializeObject(myJsonResponse);
public class Root
{
public int version { get; set; }
public List<List<object>> files { get; set; }
}
我尝试过的大部分操作都给了我一个空文件列表或以下错误:
Newtonsoft.Json.JsonSerializationException:
无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型“RonParser.VersionedFile”,因为该类型需要 JSON 对象(例如 {"name":"value"})才能正确反序列化。 要修复此错误,请将 JSON 更改为 JSON 对象(例如 {"name":"value"})或将反序列化类型更改为数组或实现集合接口的类型(例如 ICollection、IList),例如可以从 JSON 数组反序列化。 JsonArrayAttribute 也可以添加到类型中以强制它从 JSON 数组反序列化。 路径“文件 [0]”,第 4 行,位置 5。
这里如何构造数据对象?
【问题讨论】:
-
首先
field_type都错了,应该是"field_type": "uint8"、"string"等等。 -
总是验证您的 JSON 输入作为调试中的第一步。你的无效。
-
不要依赖代码生成器。虽然这样的工具可以派上用场,但除非您了解如何手写输出,否则绝对不应该使用。
-
@FranzGleichmann 我已经验证了文件,但我做了一些手动编辑,所以我不必发布 100k 行文件,在那里犯了一个小错误。更新问题并感谢您的指出。
-
使用更新的
json尝试投射,就像Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse);我认为,这个Root myDeserializedClass = JsonConvert.DeserializeObject(myJsonResponse);会给你构建错误。或将Root更改为动态或对象。