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



我正在从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));
}

在。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>(或ExpandoObject,实现Dictionary<string, object>)。

    必须使用object作为值类型,因为默认情况下System.Text.Json不支持多态,除非多态值的声明类型是object。有关确认,请参见如何使用System.Text.Json:

    序列化派生类的属性

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

  • 当使用一组固定的、已知的属性构造JSON对象时,使用匿名类型对象。

  • 当构造具有运行时属性名称但固定值类型的JSON对象时,使用类型化字典。通常,LINQ的ToDictionary()方法可以完美地匹配,如上所示。

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

  • 当手动将数字或日期格式化为字符串时,请确保在不变的区域设置中这样做,以防止JSON中出现特定于区域设置的差异。

此处演示小提琴

最新更新