c# - 如何使用 xpath/jsonpath 从 c# 中的 txt 文件中查找特定的 json 元素?
问题描述
我有很多 JSON 格式的数据到文本文件中,格式如下:
[{"ev":"AM","sym":"TMHC","v":1000,"av":74917,"op":18.92,"vw":19.1305,"o":19.13,"c":19.15,"h":19.15,"l":19.13,"a":19.143,"z":90,"n":1,"s":1549380300000,"e":1549380360000},{"ev":"AM","sym":"SPYG","v":7103,"av":184266,"op":35.27,"vw":35.3148,"o":35.3264,"c":35.34,"h":35.34,"l":35.3258,"a":35.3345,"z":710,"n":1,"s":1549380300000,"e":1549380360000},
{"ev":"AM","sym":"AAPL","v":73,"av":1866,"op":35.27,"vw":35.3148,"o":35.3264,"c":35.34,"h":35.34,"l":35.3258,"a":35.3345,"z":710,"n":1,"s":1549380300000,"e":1549380360000}]
所以我需要找到特定符号的 json 元素。就像我使用 AAPL 一样,它会为我们提供 txt 文件中的所有 AAPL 元素数据。喜欢
{"ev":"AM","sym":"AAPL","v":73,"av":1866,"op":35.27,"vw":35.3148,"o":35.3264,"c":35.34,"h":35.34,"l":35.3258,"a":35.3345,"z":710,"n":1,"s":1549380300000,"e":1549380360000}
所以请你帮我看看我应该怎么做?
static void xPathUsing()
{
const string filePath = @"D:\Aggregate_Minute_AAPL.txt";
using (StreamReader r = new StreamReader(filePath))
{
string json = r.ReadToEnd();
}
}
解决方案
由于您需要对数据运行多个操作,因此最好的方法是将数据读入内存一次(或在数据更改时再次读入)并以支持快速查询的方式保存它们。为了通过符号查找行,您可以创建一个包含数据的字典。
以下示例使用广泛使用的JSON.NET库来解析 JSON。
首先,您需要定义一个与 JSON 对象的模式相似的类,例如:
class Row
{
[JsonProperty("sym")]
public string Symbol { get; set; }
public decimal vw { get; set; }
// ...
}
请注意,您可以使用该JsonProperty
属性来为类的属性分配与 JSON 中不同的名称。
以下示例显示了如何从文件中读取数据以及如何将其转换为字典:
var input = File.ReadAllText("C:\\Temp\\abc.json");
var rows = JsonConvert.DeserializeObject<IEnumerable<Row>>(input);
var dict = rows.ToDictionary(x => x.Symbol, x => x, StringComparer.OrdinalIgnoreCase);
准备一次字典后,您可以使用索引器获取相应的行:
var aaplRow = dict["AAPL"];
推荐阅读
- angular - 如何在 Angular 8 中使用带有 DragAndDrop 的滚动条
- php - 保存 SMTP 密码供以后使用,没有哈希
- javascript - json编码字符串的数据操作
- php - Laravel:类 Illuminate\Database\Eloquent\Builder 的对象无法转换为字符串
- f# - 在此上下文中调用的运算符“(> =)”是什么?
- spring-boot - 如何在Springboot中使用Authentication Basic获取作为标头发送的访问令牌
- java - JAVA-OpenCV:视频编写器未打开
- antlr - 如何从解析器规则上下文中获取混合类型列表?
- java - 使用 if 查找和计算数组中的奇数
- java - 我们如何/为什么说 java 8 中的功能接口是标记接口