当我使用实体框架核心将模型保存到No sql cosmos db示例中时。它不持久化JsonElement JobParams,而jobParamsJson字符串是好的。我要求像对象JobParams这样的hashmap实际上被持久化在数据库中,因为它也被其他客户端使用。创建的cosmosdb文档中的JobParams字段如下所示
{ ValueKind:1 }
字符串
6pp0gazn1#
Cosmos v3 SDK默认使用Newtonsoft.Json作为序列化器,而JsonElement是System.Text.Json使用的对象。由于它没有使用来自Newtonsoft.Json的自定义JsonConverter进行装饰,因此它将使用其属性序列化它,从而使其显示为这样。如果你想使用System.Text.Json,你可以为它创建一个序列化器。下面是example from Github:
Newtonsoft.Json
JsonElement
System.Text.Json
JsonConverter
public class CosmosSystemTextJsonSerializer : CosmosSerializer { private readonly JsonObjectSerializer systemTextJsonSerializer; public CosmosSystemTextJsonSerializer(JsonSerializerOptions jsonSerializerOptions) { systemTextJsonSerializer = new JsonObjectSerializer(jsonSerializerOptions); } public override T FromStream<T>(Stream stream) { using (stream) { if (stream.CanSeek && stream.Length == 0) { return default; } if (typeof(Stream).IsAssignableFrom(typeof(T))) { return (T)(object)stream; } return (T)systemTextJsonSerializer.Deserialize(stream, typeof(T), default); } } public override Stream ToStream<T>(T input) { var streamPayload = new MemoryStream(); systemTextJsonSerializer.Serialize(streamPayload, input, input.GetType(), default); streamPayload.Position = 0; return streamPayload; } }
字符串然后在创建CosmosClient示例时将其添加到您的选项中:
CosmosClient
var client = new CosmosClient(accountEndpoint: uri, authKeyOrResourceToken: key, clientOptions: new() { Serializer = new CosmosSystemTextJsonSerializer(), });
型
1条答案
按热度按时间6pp0gazn1#
Cosmos v3 SDK默认使用
Newtonsoft.Json
作为序列化器,而JsonElement
是System.Text.Json
使用的对象。由于它没有使用来自Newtonsoft.Json
的自定义JsonConverter
进行装饰,因此它将使用其属性序列化它,从而使其显示为这样。如果你想使用
System.Text.Json
,你可以为它创建一个序列化器。下面是example from Github:字符串
然后在创建
CosmosClient
示例时将其添加到您的选项中:型