字段有需求定义为非常规数据类型,如jsonb的,前端该如何匹配?
以c#为例:
- 先定义轻包装类,转换功能都有了
csharp
// 轻量包装类,便于在模型中表明字段为 JSONB
public class JsonbString
{
public string? Value { get; set; }
// 方便隐式类型转换
public static implicit operator string(JsonbString j) => j?.Value;
public static implicit operator JsonbString(string s) => new JsonbString { Value = s };
// 返回原始 JSON 字符串(若为 null 则返回空串)
public override string ToString() => Value ?? string.Empty;
// 将 JSON 字符串反序列化为对象,失败时返回默认值(null for reference types)
public T? ToObject<T>()
{
if (string.IsNullOrEmpty(Value)) return default;
try
{
return JsonSerializer.Deserialize<T>(Value!);
}
catch
{
return default;
}
}
// Try 版本,反序列化失败不会抛出异常
public bool TryToObject<T>(out T? result)
{
result = default;
if (string.IsNullOrEmpty(Value)) return false;
try
{
result = JsonSerializer.Deserialize<T>(Value!);
return true;
}
catch
{
result = default;
return false;
}
}
// 从对象创建 JsonbString(序列化)
public static JsonbString FromObject<T>(T obj)
{
return new JsonbString { Value = JsonSerializer.Serialize(obj) };
}
// 将内容解析为 JsonDocument(调用者负责 Dispose 返回的 JsonDocument)
public JsonDocument? ToJsonDocument()
{
if (string.IsNullOrEmpty(Value)) return null;
try
{
return JsonDocument.Parse(Value!);
}
catch
{
return null;
}
}
// Try 版本,返回是否成功并输出 JsonDocument(调用者负责 Dispose)
public bool TryGetJsonDocument(out JsonDocument? doc)
{
doc = null;
if (string.IsNullOrEmpty(Value)) return false;
try
{
doc = JsonDocument.Parse(Value!);
return true;
}
catch
{
doc = null;
return false;
}
}
}
- 编写类型处理例程
csharp
public class JsonbStringTypeHandler : SqlMapper.TypeHandler<JsonbString>
{
public override void SetValue(IDbDataParameter parameter, JsonbString value)
{
if (parameter is Npgsql.NpgsqlParameter npgsqlParameter)
{
npgsqlParameter.NpgsqlDbType = NpgsqlTypes.NpgsqlDbType.Jsonb;
}
parameter.Value = (object)(value?.Value) ?? DBNull.Value;
}
public override JsonbString Parse(object value)
{
return new JsonbString { Value = value?.ToString() };
}
}
- 主程序注册这个类型处理器
csharp
SqlMapper.AddTypeHandler(new JsonbStringTypeHandler());
- 使用
在Model/Dto里面,定义这个字段的类型为JsonbString:
csharp
/// <summary>标签,JSONB任意JSON结构</summary>
public JsonbString tags { get; set; }