Dev*_*evS 8 c# json json.net system.text.json asp.net-core-5.0
我正在努力从 Json.Net 迁移到 System.Text.Json。我不确定如何使用 System.Text.Json 构建像下面的代码一样的 json 对象。我尝试了很多解决方法,但似乎没有任何效果。我知道我们可以使用JsonObjectDot net 6 来做到这一点,但我使用的是 Dot net core 5。
牛顿软件代码:
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));
}
Run Code Online (Sandbox Code Playgroud)
在 .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 });
Run Code Online (Sandbox Code Playgroud)
笔记:
当使用其值具有混合类型的属性(如json示例中的根对象)构造 JSON 对象时,请使用Dictionary<string, object>(或ExpandoObject,它实现Dictionary<string, object>)。
您必须使用objectfor 值类型,因为 System.Text.Json 默认情况下不支持多态性,除非多态值的声明类型为object。如需确认,请参阅如何使用 System.Text.Json 序列化派生类的属性:
如果将较低级别的对象定义为 type ,则可以获得多态序列化
object。
当构造具有一组固定的已知属性的 JSON 对象时,请使用匿名类型对象。
当构造具有运行时属性名称但值类型固定的 JSON 对象时,请使用类型化字典。通常 LINQ 的ToDictionary()方法非常适合,如上所示。
同样,当使用具有混合类型的值构造 JSON 数组时,请使用List<object>或object []。当所有值都具有相同类型时,可以使用类型化的List<T>or 。T []
手动将数字或日期格式化为字符串时,请务必在不变的语言环境中执行此操作,以防止 JSON 中出现特定于语言环境的差异。
演示小提琴在这里。