我需要以JSON格式获取查询结果,但如果列是JSON数组,我会遇到问题:它会转换为字符串

我当前使用的代码如下:

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,以便序列化程序正确处理它(否则您将获得如您所见的"double"编码值).一些类似的东西(未经测试):

f或 (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;
}

请注意,acc或ding to docs您可以更改默认映射.例如,使用NpgsqlJsonNetExtensions(因为您使用的是Newtonsoft Json.NET序列化程序),因此您不需要手动执行此操作:

要使用Json.NET,请将Npgsql.Json.NET包添加到项目中,并启用该插件.

var dataSourceBuilder = new NpgsqlDataSourceBuilder(...);
dataSourceBuilder.UseJsonNet();
await using var dataSource = dataSourceBuilder.Build();

NpgsqlConnection.GlobalTypeMapper.UseJsonNet();

Or you can consider providing mapping to some defined type - see the POCO mapping docs.

Csharp相关问答推荐

获取Windows和Linux上的下载文件夹

为什么我不能更改尚未设置的模拟对象属性的值?

HttpContext. RequestAborted当Android APP失go 连接时未取消

如何在Reflection. Emit中使用具有运行时定义的类型参数的泛型类型

System.Text.Json数据化的C#类映射

try 在Blazor项目中生成html

C#DateTime.ToString在ubuntu和centos中返回不同的结果

AsNoTrackingWithIdentitySolutions()似乎不起作用?

Blazor在FluentButton onClick事件上设置参数

在ASP.NET Core Web API项目中通过中间件修改`Request.Path`不会更改使用的控制器/操作

异步实体框架核心查询引发InvalidOperation异常

在使用Audit.NET的AuditTrail实现中,如何逐月将数据摄取到AzureTableStorage?

如何将MemberInitExpression添加到绑定中其他Lambda MemberInitExpression

如何使用用于VS代码的.NET Maui扩展在我的iOS/Android设备或模拟器上进行调试?

在';、';附近有错误的语法.必须声明标量变量";@Checkin";.';

映射器-如何映射到多个实体

无法创建&Quot;&Quot;类型的实例,因为无法将一个或多个参数绑定到

同时通过多个IEumable<;T&>枚举

方法加载时出现类型加载异常

C#如何替换两个XML元素值?