Postgres,jsonb& jsonb_set

时间:2017-07-21 15:07:28

标签: json postgresql

根据HTTP_USER_AGENT,我必须向客户端返回一个非常专业的json结构格式化版本。

json对象像往常一样使用标准的postgres函数生​​成。 让我们假设生成的json看起来类似于:

{
    "return_code" : 0,
    "payload" : {
        "name" : "smith",
        "age": 17,
        "address" :{
            "street" : "<whatever>",
            "city" : "<anycity>"
        }
    }
}

现在在某些情况下,我必须按以下格式返回此json:

{
    "return_code" : 0,
    "payload" : "{"name" : "smith", "age": 17, "address" :"{"street" : "<whatever>", "city" : "<anycity>"}"}"
}

正如您所看到的那样,嵌套的有效负载对象应该作为字符串返回 - 为了更好的可读性,这里忽略了屏蔽。

此外,address属性也应该作为字符串返回,而不是作为json对象返回。

我应该这样做的postgres代码就是:

response := jsonb_set(response, '{payload}', to_jsonb((response->'payload')::text));

但上面代码的结果如下:

{
    "return_code" : 0,
    "payload" : "{"name" : "smith", "age": 17, "address" :{"street" : "<whatever>", "city" : "<anycity>"}}"
}

考虑地址对象的引号丢失(只有两个)。 我该如何解决这个问题?

谢谢!

1 个答案:

答案 0 :(得分:0)

在我看来,您需要在address属性上进一步转义/引用,因为您有:

  • 您的替换:{ "payload" : { ... } } - &gt; { "payload" : "{ ... }" }
  • 额外替换:{ "address": { ... } } - &gt; { "address": "{ ... }" }

你需要在现有行之前执行,所以我认为你想要的是这个(需要一个额外的jsonb变量,payload):

payload := jsonb_set(response->'payload', '{address}', to_jsonb((response->'payload'->address)::text));
response := jsonb_set(response, '{payload}', to_jsonb(payload::text));