【发布时间】:2020-07-10 21:35:45
【问题描述】:
我正在将 ASP.NET Core 2 应用程序迁移到 ASP.NET Core 3。我的控制器需要返回具有已经是 JSON 字符串的属性的对象,所以它看起来像这样:
public class Thing {
public int Id { get; set; }
public string Name { get; set; }
public string Data { get; set; } // JSON Data
}
var thing = new Thing
{
Id = 1,
Name = "Thing",
Data = "{\"key\":\"value\"}"
};
Thing 应该被序列化,以便Data 属性不是字符串,而是 JSON 对象的一部分。像这样:
{
"id": 1,
"name": "Thing",
"data": {
"key": "value"
}
}
在 .NET Core 2 和 Newtonsoft.Json 中,我使用 JRaw 作为 Data 的类型,因此序列化程序知道该属性已经序列化为 JSON 并且没有尝试将其表示为字符串。
.NET Core 3 使用System.Text.Json,与JRaw 不兼容。有没有做同样事情的等价物?我能够使用JsonElement 作为Data 的类型并使用JsonDocument.Parse(jsonString).RootElement 转换字符串。这会产生预期的结果,但我想避免不必要的反序列化+序列化步骤,因为数据对象可能相对较大。
【问题讨论】:
-
您仍然可以在 System.Text.Json 无法使用的时候使用 Json.Net。 System.Text.Json 有意简化功能,并被引入以消除对 Json.Net 的依赖 - 但没有理由不能将其重新添加。
-
另外,完成后不要忘记处理
JsonDocument。如果你需要一个JsonElement在文件被处理后仍然存在,你需要克隆它。 -
我应该这样回答吗?
-
@dbc 继续。看来我现在必须继续使用旧的 Newtonsoft。
标签: c# json.net asp.net-core-3.1 system.text.json