我正在从Json.Net迁移到System.Text.Json。我不知道如何使用System.Text.Json像下面的代码那样构建json对象。我试了很多解决办法,但似乎都没有用。我知道我们可以使用dotnet6中的JsonObject来完成这个任务,但是我使用的是Dot 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));
}发布于 2022-06-16 17:40:42
在.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。有关确认,请参见https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-polymorphism#serialize-properties-of-derived-classes:
如果将低级对象定义为object类型,则可以获得它们的多态序列化。ToDictionary()方法非常适合,如上文所示。List<object>或object []。当所有值都具有相同类型时,可以使用类型化的List<T>或T []。演示小提琴这里。
https://stackoverflow.com/questions/72640451
复制相似问题