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

Dev*_*emi 1 c# io json

我有以下内容

 [
   {    
     "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
      }
    ]
  }
]
Run Code Online (Sandbox Code Playgroud)

实际文件有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;}
}
Run Code Online (Sandbox Code Playgroud)

所以我试图将文件解析为List

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

如果我执行上述操作,我不知道如何在C#中读取流的select元素.在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}
    ]
  }
]
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 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}");
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在这个Stock类非常难看,但它代表了JSON中的内容 - 然后应该很容易将该表示转换为更适合其余代码的表示.