首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Postgres、jsonb和jsonb_set

Postgres、jsonb和jsonb_set
EN

Stack Overflow用户
提问于 2017-07-21 23:07:28
回答 1查看 502关注 0票数 0

根据HTTP_USER_AGENT的不同,我必须向客户机返回json结构的一个非常特殊的格式化版本。

json对象是使用标准postgres函数照常生成的。假设生成的json如下所示:

代码语言:javascript
运行
复制
{
    "return_code" : 0,
    "payload" : {
        "name" : "smith",
        "age": 17,
        "address" :{
            "street" : "<whatever>",
            "city" : "<anycity>"
        }
    }
}

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

代码语言:javascript
运行
复制
{
    "return_code" : 0,
    "payload" : "{"name" : "smith", "age": 17, "address" :"{"street" : "<whatever>", "city" : "<anycity>"}"}"
}

正如您所看到的,为了提高可读性,应该将嵌套的有效负载对象作为字符串掩码返回,此处将其忽略。

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

我的postgres代码应该做到这一点很简单:

代码语言:javascript
运行
复制
response := jsonb_set(response, '{payload}', to_jsonb((response->'payload')::text));

但上述代码的结果如下所示:

代码语言:javascript
运行
复制
{
    "return_code" : 0,
    "payload" : "{"name" : "smith", "age": 17, "address" :{"street" : "<whatever>", "city" : "<anycity>"}}"
}

考虑一下address-object的引号缺失(只有两个)。我该如何解决这个问题呢?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2017-07-21 23:16:52

在我看来,您需要对address属性进行更深一层的转义/引用,因为您拥有:

{ "payload" : "{ ... }" }

  • Extra { "address": "{ ... }" }

  • Your substitution:{ "payload" : { ... } } -> Your substitution:{ "address": { ... } } -> substitution

您需要在现有行之前执行此操作,所以我认为您需要这样(需要一个额外的jsonb变量payload):

代码语言:javascript
运行
复制
payload := jsonb_set(response->'payload', '{address}', to_jsonb((response->'payload'->address)::text));
response := jsonb_set(response, '{payload}', to_jsonb(payload::text));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45241012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档