使用postgres从Json字符串化字符串中获取数据

时间:2017-07-13 23:36:54

标签: json postgresql

如何使用postgres查询从下面的json字符串字符串中获取值?我正在使用正则表达式执行此操作,但我正在尝试编写更通用/简单/可信查询的内容。是的,我不相信我写的东西,我很确定我的东西会破坏。

这就是我所拥有的:

SELECT
trim(both '" 'FROM replace(regexp_replace('phone_data', '[\\]
{2,}"([^,:])', '\1', 'g'), '\"', '"'))::json -> 'objects' -> 0 -> 'data' -> 'gpslogs' -> 0 ->> 'cataract'
FROM
  "JSON"
WHERE
  "ID" = 'eb7613c6-e7aa-4b46-984e-ebf334293fdb';  

这是数据的样子:

   {
"glossary": {
    "title": "example glossary",
    "GlossDiv": {
        "title": "S",
        "GlossList": {
            "GlossEntry": {
                "ID": "SGML",
                "SortAs": "SGML",
                "GlossTerm": "Standard Generalized Markup Language",
                "Acronym": "SGML",
                "Abbrev": "ISO 8879:1986",
                "GlossDef": {
                    "para": "A meta-markup language, used to create markup languages such as DocBook.",
                    "GlossSeeAlso": ["GML", "XML"]
                },
                "GlossSee": "markup"
            }
        }
    }
}

}

感谢您的帮助和建议。感谢。

1 个答案:

答案 0 :(得分:0)

似乎你有双重编码的JSON数据。所有真正的JSON似乎被打成一个大的字符串值,然后您必须解码,解析为JSON(击败JSONB的点),然后搜索。

经验法则是不尝试使用垃圾数据。而是,修复它,然后使用生成的干净数据。这使得一切都更快,越来越少,使用更少的内存,并节省了大量的编程时间。

这意味着只需要一个update来修复JSON数据。确保在执行此操作时启用事务,以便在出错时可以回滚。并且您必须更改导入器以在插入之前修复传入的数据。最后,可能还有其他查询假设JSON格式错误,必须将它们更改为使用合理的JSON。

然后您可以正常查询JSONB列。

select phone_device_data->'objects'->0->'data'->'gps_location_logs'->0->>'latitude'
from json_storage
where id = 'eb7613c6-e7aa-4b46-984e-ebf334293fdb';