我有一个包含JSON和计划文本的文本列。我想将其转换为JSON,然后选择一个特定的属性。例如:
user_data
_________
{"user": {"name": "jim"}}
{"user": {"name": "sally"}}
some random data string
字符串
我试过了:
select user_data::json#>'{user,name}' from users
型
我明白了:
ERROR: invalid input syntax for type json
DETAIL: Token "some" is invalid.
CONTEXT: JSON user_data, line 1: some...
型
有可能防止这种情况吗?
4条答案
按热度按时间mznpcxlj1#
如果你想跳过包含无效JSON的行,你必须首先测试文本是否是有效的JSON。你可以通过创建一个函数来尝试解析值,并捕获无效JSON值的异常来实现这一点。
字符串
当你有了它,你可以在
CASE
或WHERE
子句中使用is_json
函数来缩小有效值的范围。型
xzlaal3s2#
使用此功能:
字符串
试验项目:
型
gg58donl3#
其他人已经建议了检查JSON是否有效的方法,但我觉得与其检查,为什么不直接转换它呢?我使用这个函数(JSONB,但你可以很容易地将其更改为JSON):
字符串
r7knjye24#
我的解决办法是做一个预选来解决这个问题。
假设我们得到了一个给定的表
users
,其中列id
和user_data
。user_data
被声明为文本字段,它通常应该包含{firstName, lastName}
。user_data
中无效JSON的行(而结果集将仅包含此类行中的id
字段)user_data ~ '^{.*}$'
(“花括号检查”)检查user_data
字段中是否包含JSON。**危险!**请记住,此检查是不完整的。错误的JSON,如“{“key 1”:“value 1”,“key 2”}“仍然被识别为有效作为一个例子:
字符串