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; } 
相关推荐
李少兄2 分钟前
JavaScript 对象完全指南
开发语言·javascript·ecmascript
张小姐的猫5 分钟前
【AI大模型接入SDK】 —— Ollama本地接入Deepseek
java·linux·开发语言·网络·c++·人工智能
Nuanyt8 分钟前
JUC常见核心知识梳理01 线程 并发 JMM volatile 管程 锁 synchronized
java·开发语言·网络·jvm
半兽先生13 分钟前
MySQL + Milvus vs PostgreSQL + pgvector:AI 应用向量检索架构选型终极指南
mysql·postgresql·milvus
adaierya16 分钟前
用 AI 解决音频转换编程问题
开发语言·人工智能·python·分类·ai编程
何何____17 分钟前
web方向js考核题解
开发语言·前端·javascript
ThornArmor20 分钟前
重铸1996|首秀点亮:编写 helloworld 并用 Makefile 自动化收割第一个 .z64 卡带镜像
开发语言
船厂电气自动化ai大模型22 分钟前
AI大模型与数学 第73课 秩的核心定义、矩阵秩的通用求解方法
开发语言·数据结构·机器学习
小白学大数据1 小时前
Codex 里的 GPT 6 Astra、GPT 5.6 Sol、Terra、Luna 怎么选
开发语言·gpt·microsoft
l1t3 小时前
DeepSeek 4.1总结的Tom Lane 谈塑造 Postgres 三十年历程的架构决策
开发语言·数据库·postgresql·架构