反序列化.json字符串返回:'对象引用未设置为对象的实例'

时间:2019-02-28 20:11:39

标签: c# json deserialization

我正在尝试读取.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; }
        }

3 个答案:

答案 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 加载的对象时调用辅助函数来解决它。