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