c# - 在 C# 中迭代和解析 JSON 字符串时,有没有办法知道哪个是最后一个标记?
问题描述
我正在解析字符串上的一些 JSON 数据,以将其传递给具有自定义格式的文件。但我需要知道哪个是文件的最后一个标记,以便我用“}”而不是“}”关闭标签(也就是说,没有逗号,语法正确)。
我尝试使用该Last
属性获取最后一个令牌,但它并没有像我想象的那样工作。
这是我用来解析数据和写入文件的函数(它还将所需的数据打印到终端,但不是 JSON 数据,这就是我首先解析它的原因):
private static void ParseData()
{
JObject jsonData;
try
{
using (StreamWriter file = new StreamWriter(Globals.dataFile))
{
file.WriteLine("{");
jsonData = JObject.Parse(Globals.json);
Console.WriteLine("*********************************************");
foreach (JToken tokens in jsonData["indicator"]["values"])
{
Console.WriteLine("Fecha y hora: " + tokens["datetime"] + " Valor: " + tokens["value"] + Environment.NewLine + "*********************************************");
file.Write(Environment.NewLine + "\t{" + Environment.NewLine + "\t\t\"datetime\": " + tokens["datetime"] + ",");
file.WriteLine("\t\t\"value\": " + tokens["value"]);
if (tokens != tokens.Last)
{
file.WriteLine("\t},");
Console.WriteLine("\t},");
}
else
{
Console.WriteLine("\t}");
}
}
file.WriteLine("}");
}
}
catch (Exception ex)
{
PrintExceptionMessage(ex);
}
}
这是我正在格式化的 JSON 文件的格式:
{
"indicator": {
"name": "Precio medio horario final contratación libre suma de componentes",
"short_name": "Precio medio horario final c.libre suma",
"id": 10214,
"composited": true,
"step_type": "linear",
"disaggregated": false,
"magnitud": [{
"name": "Precio",
"id": 23
}
],
"tiempo": [{
"name": "Hora",
"id": 4
}
],
"geos": [{
"geo_id": 8741,
"geo_name": "Península"
}
],
"values_updated_at": "2019-01-31T08:05:32.000+01:00",
"values": [{
"value": 49.38,
"datetime": "2019-01-31T01:00:00.000+01:00",
"datetime_utc": "2019-01-31T00:00:00Z",
"tz_time": "2019-01-31T00:00:00.000Z",
"geo_id": 8741,
"geo_name": "Península"
}, {
"value": 47.46,
"datetime": "2019-01-31T02:00:00.000+01:00",
"datetime_utc": "2019-01-31T01:00:00Z",
"tz_time": "2019-01-31T01:00:00.000Z",
"geo_id": 8741,
"geo_name": "Península"
}, {
"value": 46.82,
"datetime": "2019-01-31T03:00:00.000+01:00",
"datetime_utc": "2019-01-31T02:00:00Z",
"tz_time": "2019-01-31T02:00:00.000Z",
"geo_id": 8741,
"geo_name": "Península"
}, {
"value": 46.5,
"datetime": "2019-01-31T04:00:00.000+01:00",
"datetime_utc": "2019-01-31T03:00:00Z",
"tz_time": "2019-01-31T03:00:00.000Z",
"geo_id": 8741,
"geo_name": "Península"
}, {
"value": 47.36,
"datetime": "2019-01-31T05:00:00.000+01:00",
"datetime_utc": "2019-01-31T04:00:00Z",
"tz_time": "2019-01-31T04:00:00.000Z",
"geo_id": 8741,
"geo_name": "Península"
}, {
"value": 50.05,
"datetime": "2019-01-31T06:00:00.000+01:00",
"datetime_utc": "2019-01-31T05:00:00Z",
"tz_time": "2019-01-31T05:00:00.000Z",
"geo_id": 8741,
"geo_name": "Península"
}, {
"value": 56.61,
"datetime": "2019-01-31T07:00:00.000+01:00",
"datetime_utc": "2019-01-31T06:00:00Z",
"tz_time": "2019-01-31T06:00:00.000Z",
"geo_id": 8741,
"geo_name": "Península"
}, {
"value": 65.58,
"datetime": "2019-01-31T08:00:00.000+01:00",
"datetime_utc": "2019-01-31T07:00:00Z",
"tz_time": "2019-01-31T07:00:00.000Z",
"geo_id": 8741,
"geo_name": "Península"
}, {
"value": 66.59,
"datetime": "2019-01-31T09:00:00.000+01:00",
"datetime_utc": "2019-01-31T08:00:00Z",
"tz_time": "2019-01-31T08:00:00.000Z",
"geo_id": 8741,
"geo_name": "Península"
}, {
"value": 66.49,
"datetime": "2019-01-31T10:00:00.000+01:00",
"datetime_utc": "2019-01-31T09:00:00Z",
"tz_time": "2019-01-31T09:00:00.000Z",
"geo_id": 8741,
"geo_name": "Península"
}, {
"value": 65.54,
"datetime": "2019-01-31T11:00:00.000+01:00",
"datetime_utc": "2019-01-31T10:00:00Z",
"tz_time": "2019-01-31T10:00:00.000Z",
"geo_id": 8741,
"geo_name": "Península"
}, {
"value": 63.71,
"datetime": "2019-01-31T12:00:00.000+01:00",
"datetime_utc": "2019-01-31T11:00:00Z",
"tz_time": "2019-01-31T11:00:00.000Z",
"geo_id": 8741,
"geo_name": "Península"
}, {
"value": 61.94,
"datetime": "2019-01-31T13:00:00.000+01:00",
"datetime_utc": "2019-01-31T12:00:00Z",
"tz_time": "2019-01-31T12:00:00.000Z",
"geo_id": 8741,
"geo_name": "Península"
}, {
"value": 56.58,
"datetime": "2019-01-31T14:00:00.000+01:00",
"datetime_utc": "2019-01-31T13:00:00Z",
"tz_time": "2019-01-31T13:00:00.000Z",
"geo_id": 8741,
"geo_name": "Península"
}, {
"value": 56.08,
"datetime": "2019-01-31T15:00:00.000+01:00",
"datetime_utc": "2019-01-31T14:00:00Z",
"tz_time": "2019-01-31T14:00:00.000Z",
"geo_id": 8741,
"geo_name": "Península"
}
]
}
}
我只从这里获取“价值”和“日期时间”数据。
我现在得到的文件有这种格式(真的很糟糕,对不起):
{
{
"datetime": 01/02/2019 01:00:00, "value": 48,68
},
{
"datetime": 01/02/2019 02:00:00, "value": 45,7
},
{
"datetime": 01/02/2019 03:00:00, "value": 44,1
},
{
"datetime": 01/02/2019 04:00:00, "value": 44,53
},
{
"datetime": 01/02/2019 05:00:00, "value": 46,87
},
{
"datetime": 01/02/2019 06:00:00, "value": 49,84
},
{
"datetime": 01/02/2019 07:00:00, "value": 56,69
},
{
"datetime": 01/02/2019 08:00:00, "value": 62,5
},
}
我想得到的是:
{
{
"datetime": 01/02/2019 01:00:00,
"value": 48,68
},{
"datetime": 01/02/2019 02:00:00,
"value": 45,7
},{
"datetime": 01/02/2019 03:00:00,
"value": 44,1
},{
"datetime": 01/02/2019 04:00:00,
"value": 44,53
},{
"datetime": 01/02/2019 05:00:00,
"value": 46,87
},{
"datetime": 01/02/2019 06:00:00,
"value": 49,84
},{
"datetime": 01/02/2019 07:00:00,
"value": 56,69
},{
"datetime": 01/02/2019 08:00:00,
"value": 62,5
}
}
非常感谢,我很抱歉。我对 JSON 和在 C# 上格式化它真的很陌生。
解决方案
您需要将您选择的键/值对从 json 解析为类对象列表,然后将其再次保存到新文件中,例如
private static void ParseData()
{
string json = File.ReadAllText(@"Path to your input json file");
JObject jsonData = JObject.Parse(json);
List<MyCustomClass> output = new List<MyCustomClass>();
foreach (JToken tokens in jsonData["indicator"]["values"])
{
output.Add(new MyCustomClass { datetime = tokens["datetime"].ToString(), value = tokens["value"].ToString() });
}
File.WriteAllText(@"Path to your output json file", JToken.FromObject(output).ToString());
}
你需要一个类对象来解析你的键/值对,
class MyCustomClass
{
public string datetime { get; set; }
public string value { get; set; }
}
输出:
[
{
"datetime": "31-01-2019 05:30:00 AM",
"value": "49.38"
},
{
"datetime": "31-01-2019 06:30:00 AM",
"value": "47.46"
},
{
"datetime": "31-01-2019 07:30:00 AM",
"value": "46.82"
},
{
"datetime": "31-01-2019 08:30:00 AM",
"value": "46.5"
},
{
"datetime": "31-01-2019 09:30:00 AM",
"value": "47.36"
},
{
"datetime": "31-01-2019 10:30:00 AM",
"value": "50.05"
},
{
"datetime": "31-01-2019 11:30:00 AM",
"value": "56.61"
},
{
"datetime": "31-01-2019 12:30:00 PM",
"value": "65.58"
},
{
"datetime": "31-01-2019 01:30:00 PM",
"value": "66.59"
},
{
"datetime": "31-01-2019 02:30:00 PM",
"value": "66.49"
},
{
"datetime": "31-01-2019 03:30:00 PM",
"value": "65.54"
},
{
"datetime": "31-01-2019 04:30:00 PM",
"value": "63.71"
},
{
"datetime": "31-01-2019 05:30:00 PM",
"value": "61.94"
},
{
"datetime": "31-01-2019 06:30:00 PM",
"value": "56.58"
},
{
"datetime": "31-01-2019 07:30:00 PM",
"value": "56.08"
}
]
推荐阅读
- c# - 在 iTextSharp 中保存 10,000 页后保存 PDF 文件很慢
- python - 无法在python生成的ubuntu中找到输出文件
- python - 使用带有可变文件名的 os.("start ...)。python
- android - 自定义首选项中的 TextView 未正确更新
- c - Ubuntu 和 CentOS 之间链接行为的差异
- apache-spark - 如何知道流式查询用于 Kafka 数据源的 Kafka 消费者组的名称?
- angular - 将数组与来自另一个数组角度 ts 的外部 id 连接起来
- c++ - VS2017:删除移动构造函数时复制构造函数不起作用
- reactjs - 打字稿声明合并以扩展或覆盖模块类型或接口属性
- python - 使用 Dataset API 和 Keras 编写 summary.scalar