我有以下内容
[
{
"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)
你绝对不应该手工解析这个问题 - 只要你正确地建模它,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中的内容 - 然后应该很容易将该表示转换为更适合其余代码的表示.
| 归档时间: |
|
| 查看次数: |
130 次 |
| 最近记录: |