我正在尝试读取.json响应。我在这里粘贴了响应: https://pastebin.com/0Zgg39si
然后我使用下面的代码。运行代码时,出现以下错误:
“ var反序列化代码”
System.NullReferenceException:“对象引用未设置为对象的实例。”
代码如下。我不确定是什么原因造成的?
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
public void test()
{
//responseBody holds the .json response
String responseBody = "";
var deserializedTickers = JsonConvert.DeserializeObject<TickersRoot>(responseBody);
foreach (var ticker in deserializedTickers.Tickers)
{
var symbol2 = ticker.Value.Symbol;
}
}
public class TickersRoot { public Dictionary<string, Ticker> Tickers { get; set; } }
public class Ticker
{
public string Symbol { get; set; }
public long Timestamp { get; set; }
public DateTime Datetime { get; set; }
public double High { get; set; }
public double Low { get; set; }
public double Bid { get; set; }
public double Ask { get; set; }
public double Vwap { get; set; }
public double Open { get; set; }
public double Close { get; set; }
public double Last { get; set; }
public double BaseVolume { get; set; }
public double QuoteVolume { get; set; }
public Info Info { get; set; }
}
public class Info
{
public List<string> a { get; set; }
public List<string> b { get; set; }
public List<string> c { get; set; }
public List<string> v { get; set; }
public List<string> p { get; set; }
public List<int> t { get; set; }
public List<string> l { get; set; }
public List<string> h { get; set; }
public string o { get; set; }
}
答案 0 :(得分:2)
根据响应,您的Info类应该是这样的(将数据类型设置为符合您的需求):
public class Info
{
public string Buy { get; set; }
public string Sell { get; set; }
public string Open { get; set; }
public string Low { get; set; }
public string High { get; set; }
public string Last { get; set; }
public string Vol { get; set; }
}
由于您在json主体上没有名为“ Tickers”的属性,因此请调用JsonConver.DeserializeObject方法,如下所示:
var deserializedTickers = JsonConvert.DeserializeObject<Dictionary<string, Ticker>>(responseBody);
然后您可以将结果迭代为:
foreach (var ticker in deserializedTickers)
{
var symbol2 = ticker.Value.Symbol;
}
答案 1 :(得分:1)
您可以更改json根对象,使其具有名为“ tickers”的属性,该属性可以封装字典
{
"tickers":{
"BTC/AUD": {
...
},
...
}
}
或将原始json直接反序列化为字典
var deserializedTickers = JsonConvert.DeserializeObject<Dictionary<string, Ticker>>(responseBody);
您还应该更改Info类以匹配json模式
答案 2 :(得分:1)
当我的 [Serializable] 对象之一只有 1 个带有必需参数的构造函数时,我遇到了这个错误。反序列化时,newtonsoft.json 包无法从数据创建实体,因为它的构造函数中有一个必需的参数。
我通过删除构造函数并记住在实例化不是从文件/json 加载的对象时调用辅助函数来解决它。