我有以下
[
{
"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}
]
}
]
答案 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");