我需要以 JSON 形式获取查询结果,但如果列是 JSONarray,我一直遇到问题:它会转换为字符串
我当前使用的代码:
var result = new List<Dictionary<string, object>>();
await using (var cmd = new NpgsqlCommand("SELECT * FROM global", conn))
await using (var reader = await cmd.ExecuteReaderAsync())
{
while (await reader.ReadAsync())
{
var row = new Dictionary<string, object>();
for (int i = 0; i < reader.FieldCount; i++)
{
row[reader.GetName(i)] = reader.GetValue(i);
}
result.Add(row);
}
}
var jsonResult = JsonConvert.SerializeObject(result, Newtonsoft.Json.Formatting.Indented);
Console.WriteLine(jsonResult);
输出:
[
{
"id": 1,
"banned": false,
"strikes": "[]"
},
{
"id": 2,
"banned": false,
"strikes": "[\"nooob\"]"
}
]
例外输出:
[
{
"id": 1,
"banned": false,
"strikes": []
},
{
"id": 2,
"banned": false,
"strikes": ["nooob"]
}
]
默认情况下,Npgsql 会将 JSON 列读取为字符串,因此您需要将其解析为 JSON,以便序列化程序正确处理它(否则您将获得双重序列化的值)。沿着这些思路(未测试):
for (int i = 0; i < reader.FieldCount; i++)
{
var name = reader.GetName(i);
var value = reader.GetValue(i);
value = name == "strikes" ? JArray.Parse(value) : value;
row[name] = value;
}
请注意,根据文档,您可以更改默认映射。例如,通过使用
NpgsqlJsonNetExtensions
(因为您使用的是 Newtonsoft Json.NET 序列化器):
要使用 Json.NET,请将 Npgsql.Json.NET 包添加到您的项目中,并启用该插件。