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 做不到,但是你可以做到!
只是一点点工作
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);
}
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 做不到,但是你可以做到!
只是一点点工作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);
}