我正在尝试使用C#中的newtonsoft解析一个相当复杂/不必要的复杂JSON输出但是由于某种原因,我的解析器总是返回null并且没有详细说明为什么会出现这种情况。
我正在尝试解析的JSON文件示例:
{
"response": {
"success": 1,
"current_time": 1362339098,
"prices": {
"35": {
"11": {
"0": {
"current": {
"currency": "keys",
"value": 39,
"value_high": 41,
"date": 1357515306
},
"previous": {
"currency": "keys",
"value": 37,
"value_high": 39
}
}
},
"3": {
"0": {
"current": {
"currency": "metal",
"value": 0.33,
"value_high": 0.66
}
}
}
},
"5002": {
"6": {
"0": {
"current": {
"currency": "usd",
"value": 0.39,
"value_high": 0.42,
"date": 1358090106
}
}
}
},
"5022": {
"6": {
"1": {
"current": {
"currency": "metal",
"value": 1.33,
"value_high": 1.55,
"date": 1357515175
}
}
}
}
}
}
}
我正在使用的C#解析器。我运行getCurrentPrices()来返回一个PriceParser对象,但返回的对象总是为null。
using System;
using System.Collections.Generic;
using System.IO;
using Newtonsoft.Json;
using System.Diagnostics;
namespace SteamBot
{
class PriceParser
{
//Methods
public PriceParser updatePrices()
{
var json = File.ReadAllText("test.json");
ParserResult result = JsonConvert.DeserializeObject<ParserResult>(json);
return result.result;
}
public Data currentPrices { get; set; }
//DATA
public class Data
{
public Response Response { get; set; }
}
public class Response
{
public string success { get; set; }
public string current_time {get; set;}
public List<Price> prices { get; set;}
}
public class Price
{
public int defindex { get; set; }
public int quality { get; set; }
public Current current { get; set; }
public Previous previous { get; set; }
}
public class Current
{
public string currency { get; set; }
public float value { get; set; }
public float value_high { get; set; }
public int date { get; set; }
}
public class Previous
{
public string currency { get; set; }
public float value { get; set; }
public float value_high { get; set; }
public int date { get; set; }
}
protected class ParserResult
{
public PriceParser result { get; set; }
}
}
}
我可能只是错过了一些愚蠢的东西但是对于我的生活我无法弄清楚什么,任何有更多JSON争吵经验的人都知道这里发生了什么?
答案 0 :(得分:3)
您将获得空值,因为您的类结构与您的JSON不匹配。
第一个问题是,当您使用ParserResult
时,您正在反序列化为Data
。 Data
有一个response
属性,与您的JSON相匹配。 ParserResult
没有此属性。
第二个问题是您已将prices
定义为List<Price>
,但您的JSON不包含数组。相反,JSON结构实际上是一系列嵌套字典。
尝试像这样定义你的内部类:
public class Data
{
public Response response { get; set; }
}
public class Response
{
public int success { get; set; }
public long current_time { get; set; }
public IDictionary<int, IDictionary<int, IDictionary<int, Price>>> prices { get; set; }
}
public class Price
{
public Quote current { get; set; }
public Quote previous { get; set; }
}
public class Quote
{
public string currency { get; set; }
public decimal value { get; set; }
public decimal value_high { get; set; }
public long date { get; set; }
}
然后,在您的updatePrices
方法中,您可以像这样反序列化:
public PriceParser updatePrices()
{
var json = File.ReadAllText("test.json");
currentPrices = JsonConvert.DeserializeObject<Data>(json);
return this;
}
以下是如何转储数据:
PriceParser parser = new PriceParser();
parser.updatePrices();
foreach (var defindex in parser.currentPrices.response.prices)
{
Console.WriteLine("defindex: " + defindex.Key);
foreach (var quality in defindex.Value)
{
Console.WriteLine("\t quality: " + quality.Key);
foreach (var price in quality.Value)
{
Console.WriteLine("\t\t index: " + price.Key);
Console.WriteLine("\t\t\t current price:");
Console.WriteLine("\t\t\t\t currency: " + price.Value.current.currency);
Console.WriteLine("\t\t\t\t value: " + price.Value.current.value);
Console.WriteLine("\t\t\t\t value_high: " + price.Value.current.value_high);
if (price.Value.previous != null)
{
Console.WriteLine();
Console.WriteLine("\t\t\t previous price:");
Console.WriteLine("\t\t\t\t currency: " + price.Value.previous.currency);
Console.WriteLine("\t\t\t\t value: " + price.Value.previous.value);
Console.WriteLine("\t\t\t\t value_high: " + price.Value.previous.value_high);
}
}
}
}
这是以上的输出:
defindex: 35
quality: 3
index: 0
current price:
currency: metal
value: 0.33
value_high: 0.66
quality: 11
index: 0
current price:
currency: keys
value: 39
value_high: 41
previous price:
currency: keys
value: 37
value_high: 39
defindex: 5002
quality: 6
index: 0
current price:
currency: usd
value: 0.39
value_high: 0.42
defindex: 5022
quality: 6
index: 1
current price:
currency: metal
value: 1.33
value_high: 1.55