如何从PostgreSQL json中提取数组
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从PostgreSQL json中提取数组相关的知识,希望对你有一定的参考价值。
参考技术A postgresql 从json数组中提取json值,并分组,汇总json数据
[java] view plain copy
"os": "android", "chn": "-1", "dan": 0, "sex": 0, "file": "lv_statistics", "time": "2017-01-23 16:47:54", "honor": 0, "chn_id": "-1", "is_pay": 0, "account": "-1", "role_id": -1, "battle_id": 1050, "game_time": 301, "role_name": "-1", "battle_name": "-1", "battle_type": 4, "lv_num_json": ["lv": 8,"num": 1,"lv": 9,"num": 10]"
[java] view plain copy
SELECT cont->>'lv_num_json' FROM log_info WHERE file = 'lv_statisticsx'
[java] view plain copy
查询结果:["lv": 8, "num": 1, "lv": 9, "num": 10]
[sql] view plain copy
--例子
select json_array_elements(lv_num_json)->'lv' lv,json_array_elements(lv_num_json)->'num' num from (
select '["lv": 8, "num": 1, "lv": 9, "num": 10]'::json lv_num_json
)as t1
输出结果:
lv num
---------------------
8 1
9 10
-- json_array_elements :展开一个JSON数组的JSON值
SELECT json_array_elements((cont->>'lv_num_json')::json)->'lv' lv,json_array_elements((cont->>'lv_num_json')::json)->'num' num
FROM log_info WHERE file = 'lv_statisticsx'
-- 按等级分组,求总人数
select lv ,sum(num::int) from(
SELECT json_array_elements((cont->>'lv_num_json')::json)->>'lv' lv,json_array_elements((cont->>'lv_num_json')::json)->>'num' num
FROM log_info WHERE file = 'lv_statisticsx'
) t1 GROUP BY lv
输出结果:
lv num
8 2
9 20
如何从 JSON.NET 的 JsonArray 中提取单个数组成员?
【中文标题】如何从 JSON.NET 的 JsonArray 中提取单个数组成员?【英文标题】:How can I extract the individual array members out of JSON.NET's JsonArray? 【发布时间】:2013-10-23 22:56:28 【问题描述】:我正在使用 HttpWebRequest 和 HttpWebResponse 从 WebAPI 方法获取 JSON。但是我需要序列化/反序列化/解析该数据。
本机 JavaScriptSerializer 已被权衡并发现不足。我尝试了 fastJSON,但它的文档非常缺乏;我拒绝了 Simple.JSON,因为它是 Beta 版,我不确定它是否支持 .NET 3.5 的 Compact Framework。我终于转向了来自 Isaacsoft 的可靠的旧 JSON.NET,但对于如何提取 Json 对象的片段部分感到困惑。
这是我目前所拥有的:
const string uri = "http://localhost:48614/api/departments";
var webRequest = (HttpWebRequest)WebRequest.Create(uri);
var webResponse = (HttpWebResponse)webRequest.GetResponse();
if ((webResponse.StatusCode == HttpStatusCode.OK) && (webResponse.ContentLength > 0))
var reader = new StreamReader(webResponse.GetResponseStream());
string s = reader.ReadToEnd();
MessageBox.Show(s);
JsonArray depts = JsonConvert.DeserializeObject<JsonArray>(s);
MessageBox.Show(string.Format("count is 0", depts.Count)); // this is right; it shows 6
. . .
如上一条评论所示,我想要的数据正在进入部门,因为它显示的数字是正确的 - 有 6 个 JSON“记录”(数组成员?)在“ s" 是 messagebox.Shown()。
但是如何从这里开始呢?这段被注释掉的代码将讲述我向其中投掷网的一些方向的悲惨故事,四处乱窜,但到目前为止失败了:
//List<Department> ld = JsonConvert.SerializeObject(depts).to;
//foreach (JObject jso in depts)
//
// jso.Values()
//
//object id, accountId, deptName;
//JToken id, accountId, deptName;
////foreach (JsonObject jso in depts)
////
//// if (jso.TryGetValue("id", out id))
////
//// MessageBox.Show(id.ToString());
////
////
//foreach (JObject jso in depts)
//
// if (jso.TryGetValue("id", id))
//
// MessageBox.Show(id.ToString());
//
//
//JsonObject dept = depts[0] as JsonObject;
//Department dept = depts[0] as Department;
//Department dept = depts[0].
//MessageBox.Show(string.Format("first record: id is 0, accountId is 1, deptName is 2", dept.Id, dept.AccountId, dept.DeptName));
//int id = depts[0].
//string accountId = depts[0].AccountId;
//string deptName = depts[0].DeptName;
//MessageBox.Show(string.Format("accountId is 0, deptName is 1", accountId, deptName));
更新
响应布赖恩·罗杰斯查看 json 的请求,此代码:
var reader = new StreamReader(webResponse.GetResponseStream());
string s = reader.ReadToEnd();
MessageBox.Show(s);
...产生这个:
更新 2
这里是测试 JSON:
["Id":0,"AccountId":"7.0","DeptName":"Dept7","Id":1,"AccountId":"8.0","DeptName":"Dept8" ,"Id":2,"AccountId":"9.0","DeptName":"Dept9","Id":3,"AccountId":"10.0","DeptName":"Dept7", "Id":4,"AccountId":"11.0","DeptName":"Dept7","Id":5,"AccountId":"12.0","DeptName":"Dept8"]
【问题讨论】:
尝试转换为 IList我不确定您从哪里获得 JsonArray
类型,但 JSON.net 使用 JArray
来表示 JSON 数组。
要访问数组中的项目,只需将索引器与要获取的项目的索引一起使用。
然后对于每个对象,您几乎可以将它们视为字典并通过索引器按名称访问成员。
但是请注意,当您通过索引器访问任何内容时,您需要将值转换为适当的类型。访问成员的类型为JToken
。
var json = @"[
""Id"":0, ""AccountId"":""7.0"", ""DeptName"":""Dept7"" ,
""Id"":1, ""AccountId"":""8.0"", ""DeptName"":""Dept8"" ,
""Id"":2, ""AccountId"":""9.0"", ""DeptName"":""Dept9"" ,
""Id"":3, ""AccountId"":""10.0"", ""DeptName"":""Dept7"" ,
""Id"":4, ""AccountId"":""11.0"", ""DeptName"":""Dept7"" ,
""Id"":5, ""AccountId"":""12.0"", ""DeptName"":""Dept8""
]";
var arr = JsonConvert.DeserializeObject<JArray>(json);
// iterate through all the objects
foreach (JObject obj in arr)
var id = (string)obj["Id"];
var accountId = (double)obj["AccountId"];
var departmentName = (string)obj["DeptName"];
// do stuff
var second = (JObject)arr[1]; // or directly access the second object
如果您的目标是 .NET 4,您可以使用 dynamic
让事情变得更简单。
dynamic arr = JsonConvert.DeserializeObject(json);
foreach (dynamic obj in arr)
string id = obj.Id;
double accountId = obj.AccountId;
string departmentName = obj.DeptName;
// do stuff
【讨论】:
谢谢;不幸的是,我们在这个项目中仅限于 .NET 3.5(仅从 .NET 1.1 移植)!以上是关于如何从PostgreSQL json中提取数组的主要内容,如果未能解决你的问题,请参考以下文章
使用 jooq/postgresql 从 json 中提取键/值对 - java
jOOQ & PostgreSQL:将从复杂 jsonb 中提取的嵌套 json 对象映射到自定义类型