2017-01-05 10 views
1

私はJObjectウィジェットのNewtosoft.JsonでRaspbianの下でmonoを使用してJSON Stringを逆シリアル化しようとしています。しかし、それはフロートをデシリアライズできません。Newtonsoft.JSON Mono Floatデシリアライズ例外

Dim myStationJSON As String 
myStationJSON = myWC.DownloadString("https://api.netatmo.com/api/getstationsdata?access_token=" & myToken.Token.access_token) 

Dim myJSON As Newtonsoft.Json.Linq.JObject 
Dim myStationName As String = "" 
Dim opts As New Newtonsoft.Json.JsonSerializerSettings 
opts.FloatParseHandling = Newtonsoft.Json.FloatParseHandling.Double 
myJSON = Newtonsoft.Json.JsonConvert.DeserializeObject(myStationJSON, opts) 

私はこの例外を取得しています:

Newtonsoft.Json.JsonReaderException:入力文字列 '-0.2' は有効な数値ではありません。 Path 'body.devices [0] .modules [0] .dashboard_data.Temperature'、line 1、position 329. Newtonsoft.Json.JsonTextReader.ParseNumber(ReadType readType)[0x00000] in:0 、Newtonsoft.Jsonの 。 (0)、Newtonsoft.Json.JsonTextReader.Read()[0x00000] in:0 、Newtonsoft.Json.Json.JsonReaderリーダー、ブールwriteChildren、ブールwriteDateConstructorAsDateのJsonTextReader.ParseValue()[0x00000] 、Boolean writeComments)[0x00000] in:0,、Newtonsoft.Json.Linq.JTokenWriter.WriteToken(Newtonsoft.Json.JsonReaderリーダー、ブールwriteChildren、ブールwriteDateConstructorAsDate、ブールwriteComments)[0x00000] in:0 、Newtonsoft.Json。 Serialization.JsonSerializerInternalReader.CreateJObject(Newtonsoft.Json.JsonReaderリーダー)[0x00000] in:0 でNewtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(Newtonsoft.Json.JsonReaderリーダー、System.Typeオブジェクト型、Newtonsoft.Json.Serialization.JsonContractコントラクト、Newtonsoft.Json.Serialization.JsonPropertyメンバ、Newtonsoft.Json.Serialization.JsonContainerContract containerContract 、Newtonsoft.Json.Service.JsonProperty containerMember、System.Object existingValue)[0x00000]中:0 Newtonsoft.Json.Service.JsonSerializerInternalReader.CreateValueInternal(Newtonsoft.Json.JsonReaderリーダー、System.Typeオブジェクトタイプ、Newtonsoft.Json.Serialization .JsonContractコントラクト、Newtonsoft.Json.Serialization.JsonPropertyメンバ、Newtonsoft.Json.Serialization.JsonContainerContract containerContract、Newtonsoft.Json.Serialization.JsonProperty containerMember、System.Object existingValue)[0x00000] in:0 、Newtonsoft.Json.Serialization。 JsonSerializerInternalReader.Deserialize(Newtonsoft.Json.Js読者onReader、System.TypeをobjectTypeに、ブールcheckAdditionalContent)[0x00000]:0

JSON:Windowsの中

{ 
"body": { 
    "devices": [ 
     { 
      "_id": "XXX", 
      "cipher_id": "enc:16:XXX", 
      "last_status_store": 1483489982, 
      "modules": [ 
       { 
        "_id": "XXX", 
        "type": "NAModule1", 
        "last_message": 1483489978, 
        "last_seen": 1483489933, 
        "dashboard_data": { 
         "time_utc": 1483489933, 
         "Temperature": -0.2, 
         "temp_trend": "stable", 
         "Humidity": 89, 
         "date_max_temp": 1483489933, 
         "date_min_temp": 1483484498, 
         "min_temp": -0.4, 
         "max_temp": -0.2 
        }, 
        "data_type": [ 
         "Temperature", 
         "Humidity" 
        ], 
        "module_name": "Außen", 
        "last_setup": 1384606905, 
        "battery_vp": 5870, 
        "battery_percent": 95, 
        "rf_status": 81, 
        "firmware": 43 
       }, 
       { 
        "_id": "XXXX", 
        "type": "NAModule4", 
        "last_message": 1483489978, 
        "last_seen": 1483489933, 
        "dashboard_data": { 
         "time_utc": 1483489933, 
         "Temperature": 21.7, 
         "temp_trend": "stable", 
         "Humidity": 38, 
         "CO2": 1139, 
         "date_max_temp": 1483489933, 
         "date_min_temp": 1483485422, 
         "min_temp": 21.5, 
         "max_temp": 21.7 
        }, 
        "data_type": [ 
         "Temperature", 
         "CO2", 
         "Humidity" 
        ], 
        "module_name": "Schlafzimmer", 
        "last_setup": 1414704430, 
        "battery_vp": 4876, 
        "battery_percent": 38, 
        "rf_status": 79, 
        "firmware": 43 
       } 
      ], 
      "place": { 
       "altitude": 210, 
       "city": "XXX", 
       "country": "DE", 
       "timezone": "Europe/XXX", 
       "location": [ 
        3.12345675665, 
        12.12345667899 
       ] 
      }, 
      "station_name": "XXX", 
      "type": "NAMain", 
      "dashboard_data": { 
       "AbsolutePressure": 993.7, 
       "time_utc": 1483489969, 
       "Noise": 51, 
       "Temperature": 21.8, 
       "temp_trend": "stable", 
       "Humidity": 44, 
       "Pressure": 1021.2, 
       "pressure_trend": "down", 
       "CO2": 1069, 
       "date_max_temp": 1483484530, 
       "date_min_temp": 1483485740, 
       "min_temp": 21.6, 
       "max_temp": 21.8 
      }, 
      "data_type": [ 
       "Temperature", 
       "CO2", 
       "Humidity", 
       "Noise", 
       "Pressure" 
      ], 
      "co2_calibrating": false, 
      "date_setup": 1384607020, 
      "last_setup": 1384607020, 
      "module_name": "Wohnzimmer", 
      "firmware": 102, 
      "last_upgrade": 1440006125, 
      "wifi_status": 62, 
      "friend_users": [ 
       "XXXX" 
      ] 
     } 
    ], 
    "user": { 
     "mail": "[email protected]", 
     "administrative": { 
      "country": "DE", 
      "reg_locale": "de-DE", 
      "lang": "de-DE", 
      "unit": 0, 
      "windunit": 0, 
      "pressureunit": 0, 
      "feel_like_algo": 0 
     } 
    } 
}, 
"status": "ok", 
"time_exec": 0.050105810165405, 
"time_server": 1483490016 
} 

それだけで正常に動作します。

+0

問題のJSONを含めるように質問を編集することができますので、完全な[mcve]がありますか? – dbc

+0

JSONが追加されました。 – TimeO84

答えて

3

私はテストするのにを持っていませんが、トレースバックから、JsonTextReader.ParseNumber()がロケール固有の文化(おそらくドイツ語で動いていますか?)の数字「-0.2」を解析しているようですsource codeに示されるように、それは明示的に、インバリアントカルチャを使用して数を解析しようとしているという事実:

double value; 
if (!double.TryParse(number, NumberStyles.Float, CultureInfo.InvariantCulture, out value)) 
{ 
    throw ThrowReaderError("Input string '{0}' is not a valid number.".FormatWith(CultureInfo.InvariantCulture, _stringReference.ToString())); 
} 

、おそらくあなたはJson.NETのフォーク版を使用している、または可能性Raspbianにいくつかのモノのバグがありますどちらかの方法で間違った文化が使用されているようです。回避策として

、あなたは一時的に不変の文化に現在のカルチャを設定しようとすることができます:思われる、

Dim opts = New Newtonsoft.Json.JsonSerializerSettings() With { _ 
     .FloatParseHandling = Newtonsoft.Json.FloatParseHandling.Double _ 
    } 

    Dim myJSON as Newtonsoft.Json.Linq.JObject 
    Dim oldCulture = Thread.CurrentThread.CurrentCulture 
    Try 
     Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture 
     myJSON = Newtonsoft.Json.JsonConvert.DeserializeObject(Of Newtonsoft.Json.Linq.JObject)(myStationJSON, opts) 
    Finally 
     Thread.CurrentThread.CurrentCulture = oldCulture 
    End Try 

そして、それが動作しない場合hereが説明したように、LANG=en_US.UTF-8を使用してexeファイルを実行してみてください同様の問題を説明する。

+1

"LANG = en_US.UTF-8"で私のexeを動かす!どうもありがとうございます! – TimeO84

関連する問題