OpenSearchClient 的自定义 JSON 转换器

问题描述 投票:0回答:1

背景:我在 OpenSearch 中的数据不一致。有时给定的属性是一个字符串,有时它是一个字符串列表。我对此无法控制。

使用

System.Text.Json
序列化器时,我可以创建一个自定义 JSON 转换器,自动将字符串列表转换为具有逗号分隔值的字符串。我可以在需要以所需方式反序列化的属性上方添加一个属性,它就发挥了魔力。

如何使用 .Net 的 OpenSearch 客户端序列化程序获得相同的功能?

这是我用于

System.Text.Json
序列化器

的代码
using Serilog;
using System;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace myProject
{
    public class ListOfStringToStringConverter : JsonConverter<string>
    {
        public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        {
            if (reader.TokenType == JsonTokenType.Null) return null;
            string strValue = "";
            try
            {
                if (JsonTokenType.String == reader.TokenType)
                {
                    strValue = reader.GetString();
                    return strValue;
                }
                else if (JsonTokenType.StartArray == reader.TokenType)
                {
                    reader.Read();
                    string val = "";
                    int i = 0;
                    while (reader.TokenType != JsonTokenType.EndArray)
                    {
                        if (i != 0) val += ",";
                        val += reader.GetString();
                        i++;
                        reader.Read();
                    }
                    return val;
                }
            }
            catch (Exception e)
            {
                Log.Error(e, "Problem during deserializing JSON value to a property. Property value will be set to null");
            }
            return null;
        }

        public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options)
        {
            if (value == null)
            {
                writer.WriteStringValue("null");
            }
            else
            {
                writer.WriteStringValue(value);
            }
        }
    }
}
[System.Text.Json.Serialization.JsonConverter(typeof(ListOfStringToStringConverter))]
public string? ItUsedToBeAList { get; set; }
.net nest opensearch json-serialization
1个回答
0
投票

不幸的是,OpenSearch .NET 客户端使用Utf8json进行序列化,因此您需要使用 Utf8json 进行自定义转换。还有一些其他与 OpenSearch .NET 客户端上的序列化相关的“问题”。希望它转移到 System.Text.Json 或支持使用任何人将来想要的序列化器。

    

© www.soinside.com 2019 - 2024. All rights reserved.