Json.net JObject.Parse在复杂的json上出错

时间:2016-10-17 23:25:47

标签: json f# json.net

以下代码:

let resp = string(argv.GetValue 0)

let json =JObject.Parse resp

给出了这个错误:

An unhandled exception of type 'Newtonsoft.Json.JsonReaderException' 
occurred in Newtonsoft.Json.dll

Input string '2.2.6' is not a valid number. 
Path 'items[0].versionName', line 1, position 39.

其中argv是此输入:

{  
     "totalCount":1,
     "items":[  
        {  
           "versionName":"2.2.6",
           "phase":"PLANNING",
           "distribution":"EXTERNAL",
           "source":"CUSTOM",
           "_meta":{  
              "allow":[  
                 "GET",
                 "PUT",
                 "DELETE"
              ],
              "href":"url",
              "links":[  
                 {  
                    "rel":"versionReport",
                    "href":"url"
                 },
                 {  
                    "rel":"project",
                    "href":"url"
                 },
                 {  
                    "rel":"policy-status",
                    "href":"url"
                 }
              ]
           }
        }
     ]
  }

我该如何解决这个问题?有没有一种简单的方法来实现一个没有错误的json阅读器?

我也遇到了这个错误:

An unhandled exception of type 'Newtonsoft.Json.JsonReaderException' 
occurred in Newtonsoft.Json.dll

Error parsing undefined value. Path 'items[0].name', line 1, position 28.

使用此输入:

{  
    "totalCount":1,
    "items":[  
        {  
            "name":"uaa",
            "projectLevelAdjustments":true,
            "source":"CUSTOM",
            "_meta":{  
                "allow":[  
                    "GET",
                    "PUT",
                    "DELETE"
                ],
                "href":"url",
                "links":[  
                    {  
                        "rel":"versions",
                        "href":"url"
                    },
                    {  
                        "rel":"canonicalVersion",
                        "href":"url"
                    }
                ]
            }
        }
    ]
}

我试图在json中读到许多不同的模式,我没有做或知道。第一个错误似乎是因为它试图从应该作为字符串输出的东西生成一个浮点数。第二个听起来像模式太复杂,需要一个类型来使用Json.Deserialize正确解析它,但我不知道如何做到这一点,因为有太多的模式需要花费太多时间他们所有的类型。这两件事都有什么办法吗?

1 个答案:

答案 0 :(得分:3)

在C#中,您可以使用dynamic之类的内容:

var json = JsonConvert.DeserializeObject(resp)

然后您可以使用以下内容访问属性:json.totalCount

在F#land中,this question提供了一些有关如何处理dynamic个对象的建议。如果你使用包FSharp.Interop.Dynamic,你可以在你的例子中得到totalCount的值,如下所示:

let value:obj = json?totalCount?Value

在我的电脑上提供1L。