Dapper 可以反序列化 json 存储为文本吗?

Can dapper deserialize json stored as text?

public class MyType
{
    public int Id { get; set;}
    public int[] MyArray { get; set; }
}

var sql = "SELECT id, MyArrayAsJson as MyArray";
var x = await connection.QueryAsync<MyType>(sql);

我在数据库中存储了一个字符串,它看起来像 json: [1,2,3,4,5]

当我使用 Dapper 查询数据库时,我希望 dapper 反序列化为一个对象,MyType。 Dapper 希望 MyArrayAsJson 成为一个字符串,因为它是,但我希望它反序列化为一个 int 数组。这可能吗?

Dapper 不想与您花哨的序列化恶作剧有任何关系 :) 基本上,不:从数据库中以字符串形式读取它,然后 反序列化。

添加一个 API 作为 BLOB/CLOB 序列提供对传入数据的更直接/原始访问会很好,但它在今天的 Dapper 中不存在。

public class JsonTypeHandler : SqlMapper.ITypeHandler
{
    public void SetValue(IDbDataParameter parameter, object value)
    {
        parameter.Value = JsonConvert.SerializeObject(value);
    }

    public object Parse(Type destinationType, object value)
    {
        return JsonConvert.DeserializeObject(value as string, destinationType);
    }
}


SqlMapper.AddTypeHandler(typeof(int[]), new JsonTypeHandler());

Dapper 做不到,但是你可以做到!

使用 Dapper Multi Mapping

只是一点点工作

Select 您的 [JsonColumn] 作为字符串,并在映射结果时反序列化 JSON 列,例如,如果您有一个 Foo class 并且您想将 [JsonColumn] 反序列化为它,请执行以下操作:

using (var db = _context.Connect())
{
    return await db.QueryAsync<Foo, string, Foo>(query, (foo, jsonColumnString) =>
    {
        return JsonSerializer.Deserialize<Foo>(jsonColumnString);
    },
    splitOn: "JsonColumn",
    param: parameters);
}