我正在尝试将依赖于Newtonsoft.Json的最后一段代码移植到System.Text.Json。
代码解析一个JSON片段并将其扁平化。这是由遗留系统生成的,因此如果可能的话,我们不希望对此进行更改。
// Comment here including the person who last made a change to the program
[
// Comment here with the date this value set was changed
[ "value1", "value2", "value3" ],
// Comment here with the date this value set was changed
[ "value1", "value2", "value3" ],
// Repeat over and over for all data
]我一直在使用以下代码对Newtonsoft.Json进行解析:
using (var sr = new StreamReader(stream))
{
var array = JArray.Parse(sr.ReadToEnd());
var flattened = array.SelectMany(x => x).ToArray();
foreach (var item in flattened)
items.Add(item.ToObject<string>());
}上面的代码提取JSON有效负载中的每个值,并将它们放入一个名为items的列表中。
如何使用System.Text.Json解析上述格式的JSON
发布于 2021-11-27 02:27:08
要将代码从Newtonsoft.Json转换为System.Txt.Json,您需要执行以下操作:
首先,我看到你在一条小溪里看书。因此,我将按原样将您的示例转储到JSON文件中。然后我会把它读到一条小溪里。我也在制作这个async
using (var stream = File.OpenRead("test.json"))
{
var multiDimentional = await JsonSerializer.DeserializeAsync<string[][]>(
stream, new JsonSerializerOptions
{
AllowTrailingCommas = true,
ReadCommentHandling = JsonCommentHandling.Skip
});
var myArray = multiDimentional.SelectMany(x => x);
foreach(var i in myArray)
{
Console.WriteLine(i);
}
}这将产生以下结果:
value1
value2
value3
value1
value2
value3因为您的示例有注释和后面的逗号,所以我为这些场景添加了例外情况。
如果您不需要这个async,那么只需删除await并将DeserializeAsync更改为Deserialize,而不是从流中读取,您必须先将其读取到字符串中。所以:
var jsonAsString = File.ReadAllText("test.json");
var multiDimentional = JsonSerializer.Deserialize<string[][]>(
jsonAsString, new JsonSerializerOptions
{
AllowTrailingCommas = true,
ReadCommentHandling = JsonCommentHandling.Skip
});
var myArray = multiDimentional.SelectMany(x => x);
foreach(var i in myArray)
{
Console.WriteLine(i);
}发布于 2021-11-25 22:25:22
你是说像这样的事吗?
var data = JsonSerializer.Deserialize<List<List<string>>>(jsonString, new JsonSerializerOptions { AllowTrailingCommas = true });
var flattenData = data.SelectMany(item => item).ToList();https://stackoverflow.com/questions/70117091
复制相似问题