从 postgres 中的 json 中提取未命名记录的值

Extract value of unnamed record from json in postgres

我的 postgres 数据库中有 json 格式的数据,如下所示:

data={"id": "1:2:3", "[{\"info\": \"No\", \"links\": [\"<link rel": "''parent'' href=''http://example.com/1''/>\"], \"uid\": 1}]", "count": "9"}

在这个 json 数据中,我有三个不同的字段:id< unnamed field >count

我得到了使用此查询提取指定列数据的逻辑:

select data->'count' as count from mydb;

有没有办法从未命名字段中获取 'uid' 信息?

您的问题更新后,您提供的JSON有效:

{"id": "1:2:3", "[{\"info\": \"No\", \"links\": [\"<link rel": "''parent'' href=''http://example.com/1''/>\"], \"uid\": 1}]", "count": "9"}

...但它并不代表你认为的那样。如果您以更易读的方式格式化 JSON,它看起来像这样:

{
    "id": "1:2:3", 
    "[{\"info\": \"No\", \"links\": [\"<link rel": 
         "''parent'' href=''http://example.com/1''/>\"], \"uid\": 1}]", 
    "count": "9"
}

因此,请注意此对象中的第二个条目具有(根据需要)一个键和一个值。我将键和相应的值放在单独的一行以突出显示这一点。

因此,与您的想法相反——以及该字符串中非常具有暗示性的内容—— 该键的值不是 JSON 字符串,而是它的一部分,而它的前半部分用作键,它(已解析转义字符)是:

[{"info": "No", "links": ["<link rel

所以下面的 SQL 会起作用:

select mydata->'[{"info": "No", "links": ["<link rel' from mydb

... 并且 return 这个值:

"'parent' href='http://example.com/1'/>\"], \"uid\": 1}]"

显然这不是您所希望的,但它表明您存储在 table 中的 JSON 在语义上是错误的,即使从技术上讲它是有效的 JSON .

对象表示总是在 JSON 中有键和值。这是 JSON 可能更有意义的方式之一:

{
    "id": "1:2:3", 
    "data": [{
        "info": "No", 
        "links": ["<link rel='parent' href='http://example.com/1'/>"],
        "uid": 1
    }], 
    "count": "9"
}

在你的 table 中使用这个 JSON,你可以这样做 SQL:

select (mydata->'data'->>0)::json->>'info' from mydb

...这将输出:

No

但是如您所见,JSON 看起来很不一样。根据您提供的信息,无法说出哪里出了问题。当您从正在使用的服务中获取 JSON 时,您应该检查它的外观。错误可能已经存在,但更可能的是您正在处理此结果以转义字符,为将值写入数据库做准备。可能正是在这种操作中,您破坏了 JSON.

的语义

提供更多信息后

您通过 URL 参数调用服务,如下所示:

$('#update').click(function(){ 
    $.post('example.com?data='+ data + '&id='+id + '&count='+count, 
        function callbackHandler(data, textstatus) {
            // some processing... 
        }, 
        "json" 
    ); 
}); 

但是这种在 URL 中传递参数的方式是不正确的,当 data 包含在 URL 中具有特殊含义的字符时当然不正确。您应该使用 encodeURIComponent 来构建 URL:

    'example.com?data=' + encodeURIComponent(data)
               + '&id=' + encodeURIComponent(id)
               + '&count=' + count 

由于 count 是数字,因此无需对其应用 encodeURIComponent,尽管这样做不会造成任何伤害。

这可能会对您从该服务器返回的数据产生积极影响。