根据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>"}}"
}
考虑地址对象的引号丢失(只有两个)。 我该如何解决这个问题?
谢谢!
答案 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));