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; } 
相关推荐
码农小河666 小时前
基于PHP的电商后台蜜罐系统
开发语言·php
starzy19907 小时前
深入理解Scala柯里化函数:函数链式变换
开发语言·scala
ShineWinsu7 小时前
对于Qt:QTreeWidget常见属性以及QTreeWidgetItem类的解析
开发语言·c++·qt·gui·客户端·多叉树·qtreewidget
落羽的落羽7 小时前
【C++】C++17的主要特性
linux·服务器·开发语言·c++·算法·机器学习
总要学点什么8 小时前
第108篇:三维特效-图片轨迹线效果——把贴图滚成一串箭头,想用它的本色反而整条消失
开发语言·javascript·ecmascript·gis·webgl·材质·cesium
暴走约伯10 小时前
【VFX工具链源码拆解 09】终极工业化闭环:基于 ID 规则驱动的全自动场景建档、骨骼挂载与男转女场景迁移
unity·c#·游戏引擎·材质
starzy199012 小时前
深入理解Scala隐式值:编译期自动装配
开发语言·后端·scala
布莱克60513 小时前
Swift 条件语句详解:从 if 到 switch 的完整指南
开发语言·ssh·swift·switch·条件语句·guard·if
吴可可12313 小时前
ActiveX调用WScript.Shell原理揭秘
开发语言
晴天的雨.99214 小时前
【C++】继承篇
java·开发语言·c++