从 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
,尽管这样做不会造成任何伤害。
这可能会对您从该服务器返回的数据产生积极影响。
我的 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
,尽管这样做不会造成任何伤害。
这可能会对您从该服务器返回的数据产生积极影响。