我想通过解析包含嵌入contianer对象的Json字符串来创建一个C#对象。请参阅代码片段中的StockHistory。
我尝试用编译器允许的多种方式定义父对象。就像在List中包装和不包装"KeyValue属性"一样,使用Dictionary也可以使用字符串来定义带有单引号和双引号的字符串。大多数Stackoverflow列表都显示一个列表或字典作为父对象(contianer)。但我的容器是嵌入式的。
但是,如果需要自定义转换器。。。我不知道该怎么写。一个代码片段会很好。我无法更改Json…它来自第三方服务器。
当我用Visual Studio 2017 json Visualizer检查json字符串时(通过突出显示变量并单击放大草),一切看起来都很好,正如预期的那样。
using Newtonsoft.Json; // I'm using NuGet vs: 12.0.0.0
using System;
using System.Collections.Generic;
namespace ConsoleApp1
{
class Program
{
public class StockHistory
{
public List<string> Meta_Data { get; set; }
public Dictionary<string, LHOCV> Lhocv { get; set; }
}
public class LHOCV
{
public float Low { get; set; }
public float High { get; set; }
public float Open { get; set; }
public float Close { get; set; }
public double Volume { get; set; }
}
static void Main(string[] args)
{
string json =
@"{
'Meta Data': {
'1. Information': 'Intraday (5min) ...',
'2. Symbol': 'MSFT',
'3. Last Refreshed': '2019-01-22 16:00:00',
'4. Interval': '5min',
'5. Output Size': 'Full size',
'6. Time Zone': 'US/Eastern'
},
'Time Series (5min)': {
'2019-01-22 16:00:00': {
'1. open': '105.2200',
'2. high': '105.8700',
'3. low': '105.1000',
'4. close': '105.8200',
'5. volume': '1619877'
},
'2019-01-22 15:50:00': {
'1. open': '105.4200',
'2. high': '105.4800',
'3. low': '105.2600',
'4. close': '105.3000',
'5. volume': '452625'
}
}
}";
StockHistory a = JsonConvert.DeserializeObject<StockHistory>(json);
// I can not get a value assigned to "a"... both container objects,
// Meta_Data and Lhocv, are rendered null.
//Console.WriteLine(a.Lhocv["2019-01-22 16:00:00"].High);
}
}
}
我期望c#变量"a"(StockHistory)包含解析的JSON键和JSON字段"元数据"one_answers"时间序列(5分钟)"的数据。
我得到的是容器的空值。
这可能会让你接近:
public class StockHistory
{
[JsonProperty("Meta Data")]
public Dictionary<string, string> Meta_Data { get; set; }
[JsonProperty("Time Series (5min)")]
public Dictionary<string, LHOCV> Lhocv { get; set; }
}
public class LHOCV
{
[JsonProperty("3. low")]
public float Low { get; set; }
[JsonProperty("2. high")]
public float High { get; set; }
[JsonProperty("1. open")]
public float Open { get; set; }
[JsonProperty("4. close")]
public float Close { get; set; }
[JsonProperty("5. volume")]
public double Volume { get; set; }
}