1. 概述
本文为您介绍 JSON解析 相关问题。
解析 JSON 数据前,建议查看:解析 JSON 数据 内容。
2. 报错及解决方案
包含转义字符
问题描述:
报错:JSON节点获取失败
原因分析:
用户数据中包含转义字符\
解决方案:
使用转义字符再转义反斜杠。
JSON修改为:
{
"name": 1,
"name2": "\\"
}
Unrecognized token 'TRUE'
问题描述:
报错:com.fr.dp.exception.FineDPException: Get json path fields error. - Not Json format! - Unrecognized token 'TRUE': was
expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false') at [Source: (ByteArrayInputStream); line: 1, column: 14]
原因分析:
用户的 JSON 数据:
select '{"name":TRUE}' as a
json 数据中,boolean 值类型应为小写的 true/false
解决方案:
select '{"name":true}' as a
Unexpected character ('"' (code 34))
问题描述:
报错:com.fr.dp.exception.FineDPException: Get json path fields error. - Not Json format! - Unexpected character ('"' (code 34)):
was expecting comma to separate Object entries at [Source: (ByteArrayInputStream); line: 3, column: 14]
原因分析:
用户JSON数据:
select '{
"name": 1,
"name2": "\n"
}' as a
转义字符个数不对。
解决方案:
select '{
"name": 1,
"name2": "\\n"
}' as a
Use bracket notion ['my prop'] if your property contains blank characters
问题描述:
json可以正常获取到节点,但是预览报错:Use bracket notion ['my prop'] if your property contains blank characters
原因分析:
fdl 中 json 解析后的字段名称英文字母中间不允许存在空格。可使用 sparksql 将空格替换成其他字符,比如_。
简道云子表单第一行没填获取不到节点
问题描述:
简道云第一行数据,子表单内容全不填的话,json 结构不完整,会显示“[]”,导致 json 解析不出来。
注:4.1.6.2 及之后版本,可以通过粘贴JSON文本的方式修改选择节点的内容,以防止出现上游有多行 JSON 文本流进时,因为第一行的JSON属性较少,导致其他json属性无法直接选择的情况。详情请参见:JSON解析算子功能说明 2.3.2节内容。
解决方案:
方案一:手动添加 jsonpath ,获取数据。
方案二:手动将子表单为空的数据结构补全:
示例:
1)使用 spark sql 算子将子表单 info 为空的 json 数据,手动补全结构。
select if(info="[]",'[
{
"_id": "",
"name": "",
"type": "",
"product": "",
"sale": ""
}
]', info) as infotext from $[简道云输入]
最终效果:
JSON数据来源丢失
问题描述
JSON解析配置成功后,重新再打开,发现解析配置中的「JSON数据来源」丢失,需要重新选择。
原因分析
JSON解析获取API数据源的时候,API返回数据超过默认的超时时间,所以JSON解析获取前置数据源失败。
解决方案
请求时间默认为 10秒,若用户的数据量较大,接口请求时间较长,4.0.13 以及之后的版本可以在FDL的 Header 内使用 FDLTimeout 字段设置超时时间。
该参数参数值需要写入正整数,如下图所示:
注:若数据量较大,JSON 格式数据建议取消勾选「将解析后的JSON数据展开为二维表」,否则会增加加载响应时间。
解析包含英文括号的字段时,提示行数不匹配
问题描述:
解析包含()的字段时,会提示:Json解析结果行数不匹配
解决方案:
如果 jsonpath 包含(),可以修改下 jsonpath 的写法,改法如下:
$..累计动销件数(简道云) -> $..['累计动销件数(简道云)']
使用方括号和单引号将包含英文括号的部分包起来即可。