我需要一些帮助解析json,所以我可以对它进行分析。随位置附带的远程站点测量数据。
我已经回答了两个简单的问题,到目前为止,它已经给了我一个脑袋试图找出一些行为。
嵌套数组(四个深)是主要问题。我无法理解为什么jsonb_array_elements调用的横向连接不能完成这项工作。
我使用postgres 9.4.4
示例json在下面,而pg / sql正在尝试使用它。
这里是样本json。数据的解剖/规范和漂亮的版本可以在下面找到:
{ " SiteRep":{ " Wx":{ " Param":[ { "姓名":" D", "单位":"罗盘", " $":" Wind Direction" }, { "姓名":" H", "单位":"%", " $":"屏幕相对湿度" } ] }, " DV":{ " dataDate":" 2014-09-23T20:00:00Z", "输入":" O", "位置":[ { "我":" 3002", " lat":" 60.749", " lon":" -0.854", " name":" BALTASOUND", "国家":"苏格兰", "大陆":"欧洲", "海拔":" 15.0", "期间":[ { "输入":" Day", "价值":" 2014-09-22Z", " Rep":[ { " D":" SSW", " H":" 88.5", " $":" 1200" }, { " D":" S", " H":" 91.6", " $":" 1260" }, { " D":" SSW", " H":" 92.8", " $":" 1320" }, { " D":" W", " H":" 92.8", " $":" 1380" } ] }, { "输入":" Day", "价值":" 2014-09-23Z", " Rep":[ { " D":" W", " H":" 88.5", " $":" 0" }, { " D":" W", " H":" 86.7", " $":" 60" }, { " D":" W", " H":" 86.2", " $":" 120" }, { " D":" WSW", " H":" 87.9", " $":" 180" } ] } ] }, { "我":" 3005", " lat":" 60.139", " lon":" -1.183", "姓名":" LERWICK(S。SCREEN)", "国家":"苏格兰", "大陆":"欧洲", "海拔":" 82.0", "期间":[ { "输入":" Day", "价值":" 2014-09-22Z", " Rep":[ { " D":" SSW", " H":" 95.3", " $":" 1200" }, { " D":" SSW", " H":" 97.4", " $":" 1260" }, { " D":" SW", " H":" 97.3", " $":" 1320" }, { " D":" W", " H":" 94.1", " $":" 1380" } ] }, { "输入":" Day", "价值":" 2014-09-23Z", " Rep":[ { " D":" WNW", " H":" 89.1", " $":" 0" }, { " D":" WNW", " H":" 88.0", " $":" 60" }, { " D":" W", " H":" 90.9", " $":" 120" }, { " D":" W", " H":" 90.9", " $":" 180" } ] } ] } ] } } }
我正在使用此代码加载:
drop table if exists foo;
create table public.foo (data jsonb);
truncate foo;
copy foo from <example json as above>
DELIMITERS e'\x02';
第一个具体任务是计算&#34; D&#34;有价值的键&#34; S&#34;。
第二项任务是按照&#34; $&#34;的不同值对这些进行分组。键。
所以我只想用这个来解析json到pg表中:
select
"locations_entries"."date" as "location_date",
"locations_entries"."value" -> 'i' as "i",
"locations_entries"."value" -> 'lat' as "lat",
"locations_entries"."value" -> 'lon' as "lon",
-- "locations_entries"."value" -> 'Period' as "Period",
"locations_entries"."value" -> 'Period' -> 'value' as "p_value",
"locations_entries"."value" -> 'Period' -> 'type' as "type",
left("locations_entries"."value"::text,64) || '...' as "value"
from
(
select "data" -> 'SiteRep' -> 'DV' -> 'dataDate' as "date",
"data" -> 'SiteRep' -> 'DV' -> 'type' as "type",
"location_entry"."value"
from foo,
lateral jsonb_array_elements(("data" -> 'SiteRep' -> 'DV' -> 'Location')::jsonb) location_entry --,
--lateral jsonb_array_elements("data" -> 'SiteRep' -> 'DV' -> 'Location' -> 'Period' ) period_entry
) "locations_entries"
order by "i"
注意第二个横向连接被注释掉了。更多关于第二个
的内容上面的调用返回两行:
location_date | i | lat | lon | p_value | type | value
------------------------+--------+----------+----------+---------+------+---------------------------------------------------------------------
"2014-09-23T20:00:00Z" | "3002" | "60.749" | "-0.854" | | | {"i": "3002", "lat": "60.749", "lon": "-0.854", "name": "BALTASO...
"2014-09-23T20:00:00Z" | "3005" | "60.139" | "-1.183" | | | {"i": "3005", "lat": "60.139", "lon": "-1.183", "name": "LERWICK...
现在,如果我取消注释第二个横向连接,它将返回零行:
location_date | i | lat | lon | value | type | value
---------------+---+-----+-----+-------+------+-------
(0 rows)
然而,如果我看看&#34;数据&#34;的价值是什么? - &GT; &#39; SiteRep&#39; - &GT; &#39; DV&#39; - &GT; &#39;地点&#39; - &GT; &#39;时期&#39;是看我在其上调用jsonb_array_elements:
i | Period
--------+---------------------------------------------------------------------
"3002" | [{"Rep": [{"$": "1200", "D": "SSW", "H": "88.5"}, {"$": "1260", ...
"3005" | [{"Rep": [{"$": "1200", "D": "SSW", "H": "95.3"}, {"$": "1260", ...
哪(我认为)应该没问题。
任何想法我做错了什么以及如何将多个嵌套数组解析成表?