无法将JsonElement类型字段保存到Cosmos DB

mqxuamgl  于 2023-08-08  发布在  其他
关注(0)|答案(1)|浏览(96)

当我使用实体框架核心将模型保存到No sql cosmos db示例中时。它不持久化JsonElement JobParams,而jobParamsJson字符串是好的。我要求像对象JobParams这样的hashmap实际上被持久化在数据库中,因为它也被其他客户端使用。
创建的cosmosdb文档中的JobParams字段如下所示

{  
   ValueKind:1   
}

字符串

6pp0gazn

6pp0gazn1#

Cosmos v3 SDK默认使用Newtonsoft.Json作为序列化器,而JsonElementSystem.Text.Json使用的对象。由于它没有使用来自Newtonsoft.Json的自定义JsonConverter进行装饰,因此它将使用其属性序列化它,从而使其显示为这样。
如果你想使用System.Text.Json,你可以为它创建一个序列化器。下面是example from Github

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示例时将其添加到您的选项中:

var client = new CosmosClient(accountEndpoint: uri, authKeyOrResourceToken: key, clientOptions: new()
{
    Serializer = new CosmosSystemTextJsonSerializer(),
});

相关问题