2016-08-24 150 views
-1

我使用这个代码来解析我的JSON字符串,它抛出一个异常,错误的是:误差解析JSON使用Json.Net

“”类型的未处理的异常出现在Myapp.exe附加信息:无法转换类型为'Newtonsoft.Json.Linq.JProperty'的对象以键入'Newtonsoft.Json.Linq.JObject'。

我已经正确地导入了Json.Net,并且这个非常相同的代码在不同的子工作,并解析得很好。

这里是我的代码:

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 } }

回答

0

最简单的方法是避免使用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