C# Dapper匹配postgresql的jsonb类型

字段有需求定义为非常规数据类型,如jsonb的,前端该如何匹配?

以c#为例:

  1. 先定义轻包装类,转换功能都有了
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;
      }
   }
}
  1. 编写类型处理例程
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() };
   }
}
  1. 主程序注册这个类型处理器
csharp 复制代码
SqlMapper.AddTypeHandler(new JsonbStringTypeHandler());
  • 使用
    在Model/Dto里面,定义这个字段的类型为JsonbString:
csharp 复制代码
/// <summary>标签,JSONB任意JSON结构</summary>
public JsonbString tags { get; set; } 
相关推荐
Vae_Mars27 分钟前
C#中的delegate委托
开发语言·c#
一直走下去-明42 分钟前
简单的http抓包解包完整代码
开发语言·python
caimouse1 小时前
ReactOS 图形系统分析(51):元文件子系统 — metafile.c
c语言·开发语言
学习星球2 小时前
Solid.js 实战:拆解官方 RealWorld 项目
开发语言·javascript·vue.js
OPEN-F2 小时前
Python进阶教程:正则表达式进阶与文本处理
开发语言·python·正则表达式
zhifou1234562 小时前
java 17升级安装
java·开发语言
夏炳辉.2 小时前
PostgreSQL 高可用集群核心配置参数全解:从原生流复制到 Patroni 企业级方案
数据库·postgresql
for_ever_love__2 小时前
python基础语法学习: 面向对象的三大特性
开发语言·python·学习
不会代码的小猴3 小时前
7. JSON
开发语言·c++·笔记·qt·算法·json
沫璃染墨3 小时前
《Qt从零入门系列(六):信号与槽进阶——从多种连接方式到Lambda表达式》
开发语言·c++·qt·代码规范·设计规范·qt5