使用System.Text.Json创建JSON对象。

8

我正在从Json.Net迁移到System.Text.Json。我不确定如何使用System.Text.Json构建像下面的代码一样的Json对象。我尝试了很多解决方法,但都没有成功。我知道我们可以使用Dot net 6中的JsonObject来完成这个操作,但我正在使用Dot net core 5。

Newtonsoft 代码:

var json = new JObject(
    new JProperty("Status", result.Status.ToString()),
    new JProperty("Duration", result.TotalDuration.TotalSeconds.ToString()));
if (result.Entries.Any())
{
    var entries = new JObject(result.Entries
        .Select(d => new JProperty(d.Key, new JObject(new JProperty("Status", d.Value.Status.ToString()), new JProperty("Duration", d.Value.Duration.TotalSeconds.ToString()), new JProperty("Description", d.Value.Description)))));

    json.Add(new JProperty("result", entries));
}

1
也许你可以在这里找到答案。另外,你遇到了什么错误? - Qing Guo
请问您能否与我们分享一下您目前尝试过的内容以及遇到了哪些问题? - Peter Csala
1
创建一个代表你想要的类,然后进行序列化。对于动态键,请使用 Dictionary - Charlieface
1个回答

5

在 .NET 5 中,你可以使用字典和匿名类型的组合来动态构建自由格式的 JSON。例如,对于 System.Text.Json,你可以重写示例代码如下:

var json = new Dictionary<string, object>
{
    ["Status"] = result.Status.ToString(),
    ["Duration"] = result.TotalDuration.TotalSeconds.ToString(NumberFormatInfo.InvariantInfo),
};

var entries = result.Entries.ToDictionary(
    d => d.Key,
    d => new { Status = d.Value.Status.ToString(), Duration = d.Value.Duration.TotalSeconds.ToString(NumberFormatInfo.InvariantInfo), Description = d.Value.Description } );
if (entries.Count > 0)
    json.Add("result", entries);

var newJson = JsonSerializer.Serialize(json, new JsonSerializerOptions { WriteIndented = true });

注意:

  • 当构建一个包含值类型混合的属性的 JSON 对象时(比如你示例中的根 json 对象),使用 Dictionary<string, object>(或者实现了 Dictionary<string, object> 接口的 ExpandoObject)。

    必须使用 object 作为值类型,因为 System.Text.Json 默认不支持多态,除非多态值的声明类型是 object。请参见 如何使用 System.Text.Json 序列化派生类的属性 进行确认:

    如果将它们定义为类型为 object,则可以获得较低级别对象的多态序列化。

  • 当构建一个具有固定、已知属性集的 JSON 对象时,请使用匿名类型对象。

  • 当构建一个具有运行时属性名称但固定值类型的 JSON 对象时,请使用一个类型化字典。通常情况下,LINQ 的 ToDictionary() 方法将完美地适配,就像上面所示的那样。

  • 同样地,当构建一个值类型混合的 JSON 数组时,请使用 List<object>object []。当所有值具有相同类型时,可以使用类型化的 List<T>T []

  • 当手动将数字或日期格式化为字符串时,请确保在不变区域设置下进行,以防止您的 JSON 中出现与区域设置相关的差异。

演示 fiddle 在此链接


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接