博士后、jsonb&;jsonb_集

博士后、jsonb&;jsonb_集,json,postgresql,Json,Postgresql,根据HTTP_USER_代理,我必须向客户端返回json结构的一个非常特殊的格式化版本 json对象像往常一样使用标准postgres函数生成。 让我们假设生成的json与以下内容类似: { "return_code" : 0, "payload" : { "name" : "smith", "age": 17, "address" :{ "street" : "<whatever>",

根据HTTP_USER_代理,我必须向客户端返回json结构的一个非常特殊的格式化版本

json对象像往常一样使用标准postgres函数生成。 让我们假设生成的json与以下内容类似:

{
    "return_code" : 0,
    "payload" : {
        "name" : "smith",
        "age": 17,
        "address" :{
            "street" : "<whatever>",
            "city" : "<anycity>"
        }
    }
}
但上述代码的结果如下所示:

{
    "return_code" : 0,
    "payload" : "{"name" : "smith", "age": 17, "address" :{"street" : "<whatever>", "city" : "<anycity>"}}"
}
{
“返回代码”:0,
有效载荷“{”姓名“:”史密斯“,”年龄“:”17,“地址“{”街道“,”城市“:”}”
}
考虑地址对象缺少引号(只有两个)。 我怎样才能解决这个问题


谢谢大家!

在我看来,您需要对
address
属性进行更高级别的转义/引用,因为您有:

  • 您的替换:
    {“有效负载”:{…}
    ->
    {“有效负载”:{…}
  • 额外替换:
    {“地址”:{…}
    ->
    {“地址”:{…}
您需要在现有行之前执行此操作,因此我认为您需要这样做(需要一个额外的
jsonb
变量,
payload
):


事实上,这应该是可能的。但这只是一个样本。返回的可能json结构在负载对象中可能完全不同。我只想在处理过程的最后创建任何结构之后,以一种通用的方式进行转换。@Cyrildam然后您需要定义结构如何变化-是否总是最多两个级别需要双引号?或者您有时可能需要
{“foo”:“{“bar”:“{“baz”:“{…}”}”}
,或者更深层的递归?内部数组也需要双引号吗?(另外,我不敢想象另一端的解析器需要这样的递归引用;我可以理解引用单个
有效负载
部分,但不确定为什么需要进一步操作。)
response := jsonb_set(response, '{payload}', to_jsonb((response->'payload')::text));
{
    "return_code" : 0,
    "payload" : "{"name" : "smith", "age": 17, "address" :{"street" : "<whatever>", "city" : "<anycity>"}}"
}
payload := jsonb_set(response->'payload', '{address}', to_jsonb((response->'payload'->address)::text));
response := jsonb_set(response, '{payload}', to_jsonb(payload::text));