1
{
    "_id": "underscore",
    "_rev": "136-824a0ef7436f808755f0712c3acc825f",
    "name": "underscore",
    "description": "JavaScript's functional programming helper library.",
    "dist-tags": {},
    "versions": {
        "1.0.3": {
            "name": "xxx",
            "description": "xxx"
        },
        "1.0.4": {},
        "1.1.0": {}
    }
}

我想从 json 文件中检索最新版本(1.1.0)。但是,它总是给我“无法将 json 对象反序列化为 RootObject 类型”的错误

这是我的课

public class versions
{
    public string name { get; set; }
    public string description { get; set; }
}

public class RootObject
{
    public List<versions> vs { get; set; }
}

这是我使用它的地方

RootObject[] dataset = JsonConvert.DeserializeObject<RootObject[]>(json);

任何想法。非常感谢

更新:

我已经更新了 JSON 文件格式,但是有些问题..

4

3 回答 3

2

我认为问题在于,在 JSON 中,您必须引用所有“字段”/属性名称。(这与标准 Javascript-Notation 不同,您可以在其中使用不带引号的属性)。

所以,你的文件应该是这样的:

{
  "_id" : "underscore",
  "versions": {
    "1.0.3" : {
       "name": "xxx",
       "description": "xxx"
    }
}

请注意,{1.0.3: { name: "xxx" } }这也不是有效的 JavaScript,因为 '1.0.3' 在 JavaScript 中是无效的标识符。

于 2013-09-05T09:45:33.273 回答
1

我已经修复了你的 json 问题。现在问你真正的问题

我想从 json 文件中检索最新版本(1.1.0)。但是,它总是给我“无法将 json 对象反序列化为 RootObject 类型”的错误

你有这样的属性名称1.0.3在编译时是未知的。所以你不能将它们反序列化为一个具体的类。您应该动态处理它们。

尝试这个:

var versions = JObject.Parse(json)["versions"]
               .Children()
               .Cast<JProperty>()
               .ToDictionary(c => c.Name, c => c.Value.ToObject<versions>());
于 2013-09-05T09:49:13.030 回答
1

查看更新答案中的 JSON:

{
  "_id" : "underscore",
  "versions": {
    "1.0.3" : {
       "name": "xxx",
       "description": "xxx"
    },
   "1.0.4" : {
       "name": "xxx",
       "description": "xxx"
    }
}

这仍然是无效的 JSON - 你有 4 个开场 { 而只有 3 个闭场 }

您应该使用http://jsonlint.com/ - 来验证您的 JSON 并确保它是有效的

于 2013-09-05T10:17:56.853 回答