【问题标题】:Error with parsing JSON using Json.Net使用 Json.Net 解析 JSON 时出错
【发布时间】:2016-08-24 01:55:52
【问题描述】:

我正在使用此代码来解析我的 JSON 字符串并引发异常,错误是:

Myapp.exe 中出现“System.InvalidCastException”类型的未处理异常附加信息:无法将“Newtonsoft.Json.Linq.JProperty”类型的对象转换为“Newtonsoft.Json.Linq.JObject”类型。

我已经正确导入了 Json.Net,并且这个相同的代码可以在不同的 sub 中工作并且解析得很好。

这是我的代码:

Dim o As JObject = JObject.Parse(responseContent)
Dim results As List(Of JToken) = o.Children().ToList
For Each item As JProperty In results
    item.CreateReader()
    Select Case item.Name
        Case "response"
            Dim BatteryCharge As String
            For Each subitem As JObject In item.Values
                BatteryCharge = subitem("battery_level")
                MessageBox.Show(BatteryCharge)
            Next
    End Select
Next

JSON 字符串看起来像这样,现在我只需要获取 battery_level 但是如果您能告诉我如何在需要时包含更多内容,那就太好了。

{ "response": { "charging_state": "Complete", // "Charging", ?? "charge_to_max_range": false, // current std/max-range setting "max_range_charge_counter": 0, "fast_charger_present": false, // connected to Supercharger? "battery_range": 239.02, // rated miles "est_battery_range": 155.79, // range estimated from recent driving "ideal_battery_range": 275.09, // ideal miles "battery_level": 91, // integer charge percentage "battery_current": -0.6, // current flowing into battery "charge_starting_range": null, "charge_starting_soc": null, "charger_voltage": 0, // only has value while charging "charger_pilot_current": 40, // max current allowed by charger & adapter "charger_actual_current": 0, // current actually being drawn "charger_power": 0, // kW (rounded down) of charger "time_to_full_charge": null, // valid only while charging "charge_rate": -1.0, // float mi/hr charging or -1 if not charging "charge_port_door_open": true } }

【问题讨论】:

    标签: json vb.net linq


    【解决方案1】:

    最简单的方法是避免使用JObject.Parse 方法,而是将其反序列化为 POCO,如下所示:

    Sub Main
        Dim response = JsonConvert.DeserializeObject(Of ResponseObject)("*your JSON string goes here*")
    
        Console.WriteLine("The battery level is " & response.response.battery_level)
    End Sub
    
    Public Class Response
        Public Property charging_state As String
        Public Property charge_to_max_range As Boolean
        Public Property max_range_charge_counter As Integer
        Public Property fast_charger_present As Boolean
        Public Property battery_range As Double
        Public Property est_battery_range As Double
        Public Property ideal_battery_range As Double
        Public Property battery_level As Integer
        Public Property battery_current As Double
        Public Property charge_starting_range As Object
        Public Property charge_starting_soc As Object
        Public Property charger_voltage As Integer
        Public Property charger_pilot_current As Integer
        Public Property charger_actual_current As Integer
        Public Property charger_power As Integer
        Public Property time_to_full_charge As Object
        Public Property charge_rate As Double
        Public Property charge_port_door_open As Boolean
    End Class
    
    Public Class ResponseObject
        Public Property response As Response
    End Class
    

    这也意味着您以后可以访问和使用除battery_level之外的其他属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-28
      • 2014-03-05
      • 2014-11-19
      • 2013-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      相关资源
      最近更新 更多