使用Newtonsoft在C#中解析动态JSON数组

时间:2018-03-10 14:58:42

标签: c# json json.net json-deserialization

我的市场API服务停止了我用来将数据存入我的C#应用​​程序的调用。他们已经发布了批量报价"功能实际上可以节省我的应用程序中的大量工作。它以JSON格式返回数据。我使用Newtonsoft来解析我的旧API调用,它返回一个非常可预测的输出。但是,现在批量报价API一次性返回动态数量的股票,我无法破解语法。

JSON输出:

{
    "Meta Data": {
        "1. Information": "Batch Stock Market Quotes",
        "2. Notes": "IEX Real-Time Price provided for free by IEX (https://iextrading.com/developer/).",
        "3. Time Zone": "US/Eastern"
    },
    "Stock Quotes": [
        {
            "1. symbol": "MSFT",
            "2. price": "96.1800",
            "3. volume": "20087326",
            "4. timestamp": "2018-03-09 13:53:07"
        },
        {
            "1. symbol": "AMD",
            "2. price": "11.6800",
            "3. volume": "63025764",
            "4. timestamp": "2018-03-09 13:53:08"
        },
        {
            "1. symbol": "NVDA",
            "2. price": "243.9600",
            "3. volume": "8649187",
            "4. timestamp": "2018-03-09 13:52:51"
        }
    ]
}

所以"股票行情"数组是我每次都需要抓取的数据,数组中的元素数量取决于用户的输入。

到目前为止,我已尝试过:

dynamic obj = JsonConvert.DeserializeObject(rawJSON);

这似乎创建了一个带有2个孩子的通用对象。我需要第二个孩子的所有孩子," Stock Quotes"。该对象包含一个count方法,显示有多少子元素" Stock Quotes"具有。我只是不确定我需要用来抓取每个子元素的语法。目标是将每个子元素放入自定义类的对象字典中。

非常感谢任何帮助,谢谢!

注意:所有其他方法都失败了我可能会操纵包含" Stock Quotes"的方括号的字符串。孩子,然后解析那些,等等。快速而肮脏,它可能会起作用 - 但它必须是一种更优雅的方法,对吗?

2 个答案:

答案 0 :(得分:1)

您可以通过为每个集创建类并使用[JsonProperty(PropertyName = "Field name")]指定JSON数据中的字段名称来实现此目的

使用类而不是dynamic的一个好处是可以获得Intellisense。

所以,你的DTO课程看起来像这样:

public class Data
{
    [JsonProperty(PropertyName = "Meta Data")]
    public Metadata Metadata { get; set; }
    [JsonProperty(PropertyName = "Stock Quotes")]
    public IList<StockQuote> StockQuotes { get; set; }
}

public class Metadata
{
    [JsonProperty(PropertyName = "1. Information")]
    public string Information { get; set; }
    [JsonProperty(PropertyName = "2. Notes")]
    public string Notes { get; set; }
    [JsonProperty(PropertyName = "3. Time Zone")]
    public string Timezone { get; set; }
}

public class StockQuote
{
    [JsonProperty(PropertyName = "1. symbol")]
    public string Symbol { get; set; }
    [JsonProperty(PropertyName = "2. price")]
    public string Price { get; set; }
    [JsonProperty(PropertyName = "3. volume")]
    public string Volume { get; set; }
    [JsonProperty(PropertyName = "4. timestamp")]
    public string Timestamp { get; set; }
}

然后你就是:

var data = JsonConvert.DeserializeObject<Data>(str);

答案 1 :(得分:0)

您可以将JObject转换为属性名称和值的字典。

//parse JSON and grab it's children. 
var JSONobj = JObject.Parse(test).Children();

//use linq to turn into dictionary, array, or whatever suits your needs. 
//turn into dictionary of property name and value
var dictionary = JSONobj
     .Select(s => (s as JProperty))
     .ToDictionary(u => u.Name, v => v.Value);

//access the children of Stock Qoutes
var accessDictionaryChildren = dictionary["Stock Quotes"].Children();

var listChildren = accessDictionaryChildren.Children().ToList();

顺便说一下:

var dictionary["Stock Quotes"]="{[
  {
    "1. symbol": "MSFT",
    "2. price": "96.1800",
    "3. volume": "20087326",
    "4. timestamp": "2018-03-09 13:53:07"
  },
  {
    "1. symbol": "AMD",
    "2. price": "11.6800",
    "3. volume": "63025764",
    "4. timestamp": "2018-03-09 13:53:08"
  },
  {
    "1. symbol": "NVDA",
    "2. price": "243.9600",
    "3. volume": "8649187",
    "4. timestamp": "2018-03-09 13:52:51"
  }
]}