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; } 
相关推荐
峥无1 小时前
C++11 深度详解:现代 C++ 基石全梳理
开发语言·c++·笔记
阿米亚波1 小时前
【C++ STL】std::unordered_multimap
开发语言·数据结构·c++·笔记·stl
SomeB1oody2 小时前
【RustyML入门】1.0. 快速上手
开发语言·后端·机器学习·rust·教程
狗凯之家源码网2 小时前
短剧系统搭建实战:源码功能与商业变现效果全景展示
开发语言·php
caishenzhibiao2 小时前
期货先行者主图 同花顺期货通指标
java·c语言·c#
库拉库拉里2 小时前
Word文档的标题总是自动出现首行缩进怎么办?
c#·word·xhtml
在世修行2 小时前
从零打造 C# 工业视觉检测系统(一):项目全景与架构设计
c#·视觉检测
易筋紫容3 小时前
创建型模式:对象的诞生艺术
开发语言·前端·javascript
888CC++3 小时前
C++ 快速学习指南:从入门到进阶的实战路线
开发语言·c++
小小晓.4 小时前
C++记:函数
开发语言·c++·算法