我试图从json字符串反序列化double
值的二维数组。以下代码复制了我的问题:
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
// Here is the json string I'm deserializing:
string json = @"{
""array2D"": [
[
1.2120107490162675,
-0.05202334010360783,
-0.9376574575207149
],
[
0.03548978958456018,
1.322076093231865,
-4.430964590987738
],
[
6.428633738739363e-05,
-1.6407574756162617e-05,
1.0
]
],
""y"": 180,
""x"": 94
}";
// Here is how I deserialize the string:
JObject obj = JObject.Parse(json);
int x = obj.Value<int>("x");
int y = obj.Value<int>("y");
// PROBLEM: InvalidCastException occurs at this line:
double[,] array = obj.Value<double[,]>("array2D");
两个整数x
和y
具有预期值94
和180
。但是当执行命中// PROBLEM
行时,会发生以下异常:
An unhandled exception of type
'System.InvalidCastException'
occurred in Newtonsoft.Json.dll
Additional information:
Cannot cast Newtonsoft.Json.Linq.JArray
to Newtonsoft.Json.Linq.JToken.
我应该如何使用json.NET以便不会发生此异常?
array
的预期值应该清楚。
答案 0 :(得分:4)
这有效:
JObject obj = JObject.Parse(json);
double[,] array = obj["array2D"].ToObject<double[,]>();
因为,根据@dbc,
这种差异似乎没有得到很好的记录。 jsfiddle基本上用JToken.Value表示基本类型,而Convert.ChangeType实际反序列化。
答案 1 :(得分:-1)
您可以这样做:
JObject j = JObject.Parse(json);
var list = j.SelectToken("array2D").ToString();
var data = JsonConvert.DeserializeObject<double[,]>(list);
这一行:
JObject j = JObject.Parse(json);
不反序列化数据,只是将其解析为Object
。您仍然需要告诉JSON.NET您希望它序列化的对象类型。