首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用System.Text.Json创建JSON对象

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

Stack Overflow用户
提问于 2022-06-16 04:26:22
回答 1查看 2.5K关注 0票数 2

我正在从Json.Net迁移到System.Text.Json。我不知道如何使用System.Text.Json像下面的代码那样构建json对象。我试了很多解决办法,但似乎都没有用。我知道我们可以使用dotnet6中的JsonObject来完成这个任务,但是我使用的是Dot 5。

Newtonsoft代码:

代码语言:javascript
复制
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));
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-16 17:40:42

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

代码语言:javascript
复制
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类型,则可以获得它们的多态序列化。
  • 当使用一组固定的已知属性构造JSON对象时,使用匿名类型对象。
  • 在构造具有运行时属性名称但具有固定值类型的JSON对象时,请使用类型化字典。通常,LINQ的ToDictionary()方法非常适合,如上文所示。
  • 类似地,当使用具有混合类型的值构造JSON数组时,请使用List<object>object []。当所有值都具有相同类型时,可以使用类型化的List<T>T []
  • 当手动将数字或日期格式化为字符串时,请确保在不变区域设置中这样做,以防止JSON中特定于地区的差异。

演示小提琴这里

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72640451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档