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