如何使用 Npgsql 从 SELECT 中获取所有查询结果

问题描述 投票:0回答:1

我需要以 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"]
  }
]
c# postgresql npgsql
1个回答
0
投票

默认情况下,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 包添加到您的项目中,并启用该插件。

© www.soinside.com 2019 - 2024. All rights reserved.