json.NET抛出一个反序列化二维数组的InvalidCastException

时间:2015-07-27 16:58:39

标签: c# arrays json casting json.net

我试图从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");

两个整数xy具有预期值94180。但是当执行命中// 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的预期值应该清楚。

2 个答案:

答案 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您希望它序列化的对象类型。