如何用 System.Text.Json 序列化文字 JSON 值?
How can I serialize a literal JSON value with System.Text.Json?
我在 C# 6 中有一个 class,类似于以下内容:
public class Foo {
public string Name { get; set; }
public string OtherStuff { get; set; }
}
OtherStuff
属性 是已知有效的 JSON 编码字符串。
我正在尝试使用默认的 System.Text.Json
序列化程序从 API 方法 return 这个 class 。但是我希望 OtherStuff
直接写成 ,而不是转义为字符串值。
我尝试过的事情:
- 在
JsonSerializerOptions
中查找相关内容。
- 尝试使用
System.Text.Json.Nodes.JsonNode
而不是 string
。它仍然以字符串形式发出值。
- 尝试编写自定义
JsonConverter
,但 Write()
方法采用 Utf8JsonWriter
,似乎无法将字符串 编写为文字值,只有将字符串写成JSON字符串的方法。
public class LiteralJsonConverter : JsonConverter<string> {
public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
=> reader.GetString();
public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options)
=> writer.WriteStringValue(value); // Can't find a method to write a pre-encoded value
}
我想避免将这个字符串从 JSON 解析为一个对象,这样我就可以在 JSON 中重新发出它。它是我数据库中的 JSON 字符串,数据模型对 API.
是不透明的
谁能提出解决方案?
System.Text.Json
从版本 6 开始支持此方法,方法称为 WriteRawValue:
public class LiteralJsonConverter : JsonConverter<string>
{
public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
=> reader.GetString();
public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options) =>
writer.WriteRawValue(value);
}
如果您使用的是 .NET 6,则它默认可用。否则,您可以安装版本 6 的 nuget 包 System.Text.Json
来访问此功能(此包支持 .NET Standard,因此甚至可以在旧的 .NET 4 中使用)。
请注意,它接受第二个参数:skipInputValidation
,因此为了获得更高的性能,如果您确定您所写的内容有效 json - 您可以跳过它并使用 WriteRawValue(value, true)
.
我在 C# 6 中有一个 class,类似于以下内容:
public class Foo {
public string Name { get; set; }
public string OtherStuff { get; set; }
}
OtherStuff
属性 是已知有效的 JSON 编码字符串。
我正在尝试使用默认的 System.Text.Json
序列化程序从 API 方法 return 这个 class 。但是我希望 OtherStuff
直接写成 ,而不是转义为字符串值。
我尝试过的事情:
- 在
JsonSerializerOptions
中查找相关内容。 - 尝试使用
System.Text.Json.Nodes.JsonNode
而不是string
。它仍然以字符串形式发出值。 - 尝试编写自定义
JsonConverter
,但Write()
方法采用Utf8JsonWriter
,似乎无法将字符串 编写为文字值,只有将字符串写成JSON字符串的方法。
public class LiteralJsonConverter : JsonConverter<string> {
public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
=> reader.GetString();
public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options)
=> writer.WriteStringValue(value); // Can't find a method to write a pre-encoded value
}
我想避免将这个字符串从 JSON 解析为一个对象,这样我就可以在 JSON 中重新发出它。它是我数据库中的 JSON 字符串,数据模型对 API.
是不透明的谁能提出解决方案?
System.Text.Json
从版本 6 开始支持此方法,方法称为 WriteRawValue:
public class LiteralJsonConverter : JsonConverter<string>
{
public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
=> reader.GetString();
public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options) =>
writer.WriteRawValue(value);
}
如果您使用的是 .NET 6,则它默认可用。否则,您可以安装版本 6 的 nuget 包 System.Text.Json
来访问此功能(此包支持 .NET Standard,因此甚至可以在旧的 .NET 4 中使用)。
请注意,它接受第二个参数:skipInputValidation
,因此为了获得更高的性能,如果您确定您所写的内容有效 json - 您可以跳过它并使用 WriteRawValue(value, true)
.