我正在从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中出现特定于区域设置的差异。
此处演示小提琴