如何将类实例转换为 JsonDocument?

pbn*_*pbn 7 c# entity-framework npgsql asp.net-core

假设我们有一个如下所示的实体类:

public class SerializedEntity
{
    public JsonDocument Payload { get; set; }

    public SerializedEntity(JsonDocument payload)
    {
        Payload = payload;
    }
}
Run Code Online (Sandbox Code Playgroud)

根据npsql这会生成一个表,该表payload的类型jsonb为此类,这是正确的。

现在我想做的是获取任何类实例并将其存储payload在此表中,例如:

public class Pizza {
    public string Name { get; set; }
    public int Size { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后应该可以作为具有以下结构的对象进行检索:

{Name: "name", Size: 10}
Run Code Online (Sandbox Code Playgroud)

所以我需要这样的东西:

var pizza = new Pizza("Margharita", 10);
var se = new SerializedEntity(someConverter.method(pizza))
Run Code Online (Sandbox Code Playgroud)

Mar*_*tin 14

您可以使用.NET 6 中添加的JsonSerializer.SerializeToDocument 。在您的情况下,您最终会得到以下结果:

var pizza = new Pizza("Margharita", 10);
var se = new SerializedEntity(JsonSerializer.SerializeToDocument(pizza))
Run Code Online (Sandbox Code Playgroud)


Fil*_*dor 6

使用System.Text.Json有点尴尬但可能:

using System.Text.Json;
using System.Text.Json.Serialization;

var pizza = new Pizza("Margharita", 10);
var se = new SerializedEntity(JsonDocument.Parse(JsonSerializer.Serialize(pizza)));
Run Code Online (Sandbox Code Playgroud)

自(我认为)v3.0 以来,它已内置到 dotnet core 中,因此您不需要任何额外的第 3 方库。只是不要忘记usings。

不过,可能有一些技巧可以让解析更高效(使用异步 API,也许或者像 Magnus 建议的那样,通过使用序列化为二进制SerializeToUtf8Bytes)。

我还没有找到任何直接从Tobject到的方法JsonDocument我不敢相信这在某种程度上是不可能的。如果您知道它是如何工作的,请发表评论或添加您的答案。

  • 请注意,JsonDocument 是一次性的。https://learn.microsoft.com/en-us/dotnet/api/system.text.json.jsondocument?view=netcore-3.1 (2认同)