在我的C#程序,我查询一个Web服务,并得到一个答复流回到JSON,看起来是这样的:Newtonsoft JSON反序列化为原始类型
{"val":12345.12},{"val":23456.23},{"val":34567.01},...
,或者每回答可能超过1值对象:
{"val1":12345.12,"val2":1},{"val1":23456.23,"val2":3},....
我有利用Newtonsoft.Json库解析流,并执行每个解析对象的某些动作,一次一个下面的代码:
public void ParseReply<T>(StreamReader sr, Action<T> action)
{
using (var reader = new JsonTextReader(sr))
{
var ser = new JsonSerializer();
while (reader.Read())
{
if (reader.TokenType == JsonToken.EndArray)
break;
action(ser.Deserialize<T>(reader));
}
}
}
因此,在第二个结果的情况下,我有以下代码:
public class MyObject
{
public double val1;
public double val2;
}
然后:
myJson.ParseReply<MyObject>(sr, obj => ...);
完美。
但是,在第一个回复(每件1倍的值)的情况下,如果我尝试使用我的方法以下列方式:
myJson.ParseReply<double>(sr, dbl => ...);
我得到一个错误说:
Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Double' because the type requires a JSON primitive value (e.g. string, number, boolean, null) to deserialize correctly.
To fix this error either change the JSON to a JSON primitive value (e.g. string, number, boolean, null) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List<T>) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object.
我真的很失落/好奇我怎么能更新我的代码,以便能够正确解析这两个,我有点在这个错误消息丢失。任何帮助将非常感谢!
您输入不包含双打,它包含的对象以'val'property。你为什么期望能够解析它为双重?为什么不尝试和你一样的事情,比如定义'MyObj {public double val;}'? –
@PanagiotisKanavos,我知道这会起作用,你的回答非常有道理,我只是希望有一个更好的方法来做到这一点/有一种方法可以简单地将答复解析为原始类型。 –
但你*不*有任何双重值。如果你这样做了,字符串的格式应该是'[123.45,234.56,2343.54]'。你有什么实际上是字典 –