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; } 
相关推荐
余额瞒着我当琳28 分钟前
C++ map 底层与AVL 树
开发语言·c++·算法
喆星时瑜32 分钟前
R语言向量语法的详细教程
开发语言·r语言
乃嘿仔42 分钟前
AI 热点日报 · 2026-10-01
开发语言·人工智能·php
重生之小比特1 小时前
【C++进阶】异常
开发语言·c++
朝朝辞暮i1 小时前
C++ 第 15 课:指针 * 和地址 &
开发语言·c++
奶茶树1 小时前
【C++】14. C++11新特性【下】
开发语言·c++
web打印社区2 小时前
汽修 / 4S 店:维修工单、结算单网页怎么静默出纸
开发语言·前端·javascript·chrome·ecmascript
Sirens.2 小时前
Java多线程实例:单例模式、阻塞队列、线程池与定时器
java·开发语言·单例模式
沫璃染墨2 小时前
《从零入门Linux系统篇(五十三):线程篇·六——线程互斥详解:从并发问题到mutex互斥锁》
linux·运维·服务器·开发语言·后端·架构·系统架构
老王爱玩车2 小时前
深入理解指针6
c语言·开发语言·学习