在c#中解析json w变量键值对

时间:2017-07-21 21:30:22

标签: c# json io

我有以下

 [
   {    
     "name": "ATVI",
     "dailyClosePrice": [
       {
         "3/15/2017": 210.08,
         "4/6/2017": 235.08,
         "4/21/2017": 243.61,
         "2/16/2017": 205.43
       }
     ]
   },
   {
    "name": "ADBE",
    "dailyClosePrice": [
      {
        "3/15/2017": 241.96,
        "4/6/2017": 270.22,
        "4/21/2017": 281.22,
        "2/16/2017": 225.26
      }
    ]
  }
]

实际文件有2个以上,但你可以看到有两个 这里的主要对象。 我在解析键值对时遇到问题,例如"3/15/2017": 210.08

我需要创建一个类,我想一个示例类将有

class Stock
{
    public string Name{get;set;}
    public List<Entry> Prices{get;set;}
}

class Entry
{
    public string Date{get;set;}
    public double Price{get;set;}
}

所以我试图将文件解析为          列表

我想我可以使用StreamReader并使用Seek方法来查找 a&#34;:&#34;,但我遇到的问题是如何只能阅读&#34; ATVI&#34;。一旦我得到&#34; ATVI&#34;例如,我将该字符串设置为股票中的名称,然后可以寻找&#34; {&#34;并阅读&#34; 2017年3月15日&#34;并将其设置为条目中的日期然后寻找&#34;:&#34;并阅读双重等等。

如果我执行上述操作,我不知道如何在C#中读取流的选定元素。在C#中我主要读取具有公共间距的字符串,通常我会使用C来处理更复杂的事情,但是我真的希望使用c#代替C来实现这一点。

我不在乎需要使用哪种方法,我只想阅读文件。

如果我有类似下面的内容,我会使用NewtonSoft

[
  {
    "name": "ATVI",
    "dailyClosePrice": [
      {"Date":"3/15/2017", "price":210.08}, 
      {"Date":"3/15/2017", "price": 210.08},
      {"Date":"4/6/2017", "price": 235.08},
      {"Date":"4/21/2017", "price": 243.61}
    ]
  },
  {
    "name": "ADBE",
    "dailyClosePrice": [
      {"Date":"3/15/2017", "price":210.08}, 
      {"Date":"3/15/2017", "price": 210.08},
      {"Date":"4/6/2017", "price": 235.08},
      {"Date":"4/21/2017", "price": 243.61}
    ]
  }
]

2 个答案:

答案 0 :(得分:5)

你绝对不应该手工解析这个问题 - 只要你正确地对它进行建模,Json.NET就完全没问题了。 JSON表示一个对象列表,每个对象都有一个name(字符串)和一个dailyClosePrice,它似乎是一个总是有一个值的列表,而这个值又是一个对象映射日期到价格。你可以很容易地代表:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Newtonsoft.Json;

public class Stock
{
    public string Name { get; set; }
    public List<Dictionary<string, decimal>> DailyClosePrice { get; set; }
}

class Test
{
    static void Main(string[] args)
    {
        string json = File.ReadAllText("test.json");
        var stocks = JsonConvert.DeserializeObject<List<Stock>>(json);

        foreach (var stock in stocks)
        {
            Console.WriteLine($"Name: {stock.Name}");
            Console.WriteLine("Prices:");
            // Assume there's only ever a single entry, at least for now...
            var prices = stock.DailyClosePrice.Single();
            // TODO: Parse the (ugly, US-based) date format...
            var entries = prices.Select(kvp => new { Date = kvp.Key, Price = kvp.Value });
            foreach (var entry in entries)
            {
                Console.WriteLine($"  {entry.Date}: {entry.Price}");
            }
        }
    }
}

既然Stock类非常丑陋,但它代表了JSON中的内容 - 那么应该很容易将该表示转换为更适合其余代码的表示。

答案 1 :(得分:1)

您始终可以使用this technique为JSON创建C#类。

您的JSON需要以下类:

public class Stock
{
    public string Name { get; set; }
    public IEnumerable<IDictionary<DateTime, float>> DailyClosePrice { get; set; }
}

下载JSON.NET库(以NuGet包的形式提供)。然后使用这样的库,你就完成了:

var stocks = JsonConvert.DeserializeObject<List<Stock>>("YourJSON");