首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用System.Text.Json扁平嵌套字典

用System.Text.Json扁平嵌套字典
EN

Stack Overflow用户
提问于 2021-11-25 20:49:31
回答 2查看 319关注 0票数 0

我正在尝试将依赖于Newtonsoft.Json的最后一段代码移植到System.Text.Json

代码解析一个JSON片段并将其扁平化。这是由遗留系统生成的,因此如果可能的话,我们不希望对此进行更改。

代码语言:javascript
复制
// 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进行解析:

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-27 02:27:08

要将代码从Newtonsoft.Json转换为System.Txt.Json,您需要执行以下操作:

首先,我看到你在一条小溪里看书。因此,我将按原样将您的示例转储到JSON文件中。然后我会把它读到一条小溪里。我也在制作这个async

代码语言:javascript
复制
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);
    }
}

这将产生以下结果:

代码语言:javascript
复制
value1
value2
value3
value1
value2
value3

因为您的示例有注释和后面的逗号,所以我为这些场景添加了例外情况。

如果您不需要这个async,那么只需删除await并将DeserializeAsync更改为Deserialize,而不是从流中读取,您必须先将其读取到字符串中。所以:

代码语言:javascript
复制
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);
}
票数 1
EN

Stack Overflow用户

发布于 2021-11-25 22:25:22

你是说像这样的事吗?

代码语言:javascript
复制
var data = JsonSerializer.Deserialize<List<List<string>>>(jsonString, new JsonSerializerOptions { AllowTrailingCommas = true });

var flattenData = data.SelectMany(item => item).ToList();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70117091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档