多层嵌套的json数据

很多时候我们见到的json数据都是多层嵌套的,就像下面这般:

{"name":"桔子桑",
  "sex":"男",
  "age":18,
"grade":{"gname":"三年八班",
         "gdesc":"初三年级八班"
         }
 }

要获得以上类型json数据,不外乎以下步骤:

1.数据库查询

sql:select s.name,s.sex,s.age,g.gname,g.gdesc

from student s,grade g

where s.gid = g.gid;        (你也可以选择用内连接的方法写)

这样我们就查询到了想要的信息,很显然,查询结果是一个Object[]的集合。

2.新建javaBean

其实开发工具会根据数据库多表之间的关系自动生成java实体类student,

但是,大多时候是部分字段查询,如果将查询结果直接转给现有的javaBean,

会出现未查询属性显示为0、[]的情况,所以我觉得有必要根据查询字段新建一个javaBean类,

针对上面的查询,新建以下两个javaBean:

//Ostudent类成员变量
private String name;
private String sex;
private String age;
private Ograde grade;

//Ograde类成员变量
private String gname;
private String gdesc;

3.查询结果的转化

List<Object[]> listDB = query.list();
List<Ostudent> listOut = new ArrayList();
for (Object[] object : listDB) {
            String name = (String) object[0];
            String sex = (String) object[1];
            String age = (String) object[2];
            String gname = (String) object[3];
            String gdesc = (String) object[4];
            Ograde gra = new Ograde(gname,gdesc);
            Ostudent stu = new Ostudent(name,sex,age,gra);
            listOut.add(stu);
}

于是查询结果就转化成了n个Ostudent对象的集合。

4.响应数据

由于是Ostudent对象的集合,那么我们就可以用以下语句将其转为json字符串

JSONArray array = JSONArray.fromObject(objOut);
String jsonstr = array.toString();
response.getWriter().print(jsonstr);

这样就将查询结果以多层嵌套的json数据形式响应出去了。

5.前端调用

前端发起ajax请求成功之后,获得数据,我们在请求成功的回调函数里面可以这样写:

var json = $.parseJSON( data );
$.each(json, function (index, item) {
        var name = json[index].name;
        var age = json[index].age;
        var gname = json[index].grade.gname;
});

是不是很简单?

6.后台调用

这里参考网上一个注释写得很全的,加以修改,然后记录下来

public static String getjson(String path, String parameter, String method) {
        try {
            URL url = new URL(path);
            PrintWriter out = null;
            String line;
            StringBuilder sb = new StringBuilder();
            // 打开和url之间的连接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            // 请求方式
            conn.setRequestMethod(method);
            // //设置通用的请求属性
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent",
                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
            // 设置是否向httpUrlConnection输出,设置是否从httpUrlConnection读入,此外发送post请求必须设置这两个
            // 最常用的Http请求无非是get和post,get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet,
            // post与get的 不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。
            conn.setDoOutput(true);
            conn.setDoInput(true);
            // 获取URLConnection对象对应的输出流
            out = new PrintWriter(conn.getOutputStream());
            // 发送请求参数即数据
            out.print(parameter);
            // 缓冲数据
            out.flush();
            // 获取URLConnection对象对应的输入流
            InputStream is = conn.getInputStream();
            // 构造一个字符流缓存
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            while ((line = br.readLine()) != null) {
                sb.append(line);
            }
            // 关闭流
            is.close();
            // 断开连接,最好写上,disconnect是在底层tcp socket链接空闲时才切断。如果正在被其他线程使用就不切断。
            // 固定多线程的话,如果不disconnect,链接会增多,直到收发不出信息。写上disconnect后正常一些。
            conn.disconnect();
            String str = sb.toString();
            return str;
        } catch (Exception e) {
            e.printStackTrace();
            return "出错喽";
        }
    }

调用方法,获得json字符串,接下来就是将json字符串转化为java对象了

        String jsonstr = getjson(path, param, method);
        System.out.println(jsonstr);
        JSONArray jsonArray = JSONArray.fromObject(jsonstr);
        Object o = jsonArray.get(0);
        JSONObject jsonObject = JSONObject.fromObject(o);
        Student stu = (Student) JSONObject.toBean(jsonObject, Student.class);
        System.out.println(stu.getGrade());

因为通常查询所得记录很多,所以json字符串会是多个对象的集合的形式(数组),

所以首先由json字符串--->转化为json数组--->获取数组项(对象)--->转化为json对象--->转化为对应的javaBean对象。

之后怎么获取成员变量的值就不多啰嗦了。

原文地址:https://www.cnblogs.com/eco-just/p/8503673.html

时间: 2024-10-07 00:39:25

多层嵌套的json数据的相关文章

python中jsonpath模块,解析多层嵌套的json数据

1. jsonpath介绍用来解析多层嵌套的json数据;JsonPath 是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,包括:Javascript, Python, PHP 和 Java. 使用方法如: import jsonpathres=jsonpath.jsonpath(dic_name,'$..key_name')#嵌套n层也能取到所有key_name信息,其中:“$”表示最外层的{},“..”表示模糊匹配,当传入不存在的key_name时,程序会返回

js解析多层嵌套的json,取出所有父元素属性和遍历所有子元素

已知一个多层嵌套的json,取出所有父元素和子元素的id值 思路:因为不知道到底嵌套了多少层,递归有可能造成栈溢出.查询时间特别久的问题 所以先查询一次,判断是否有子节点,如果有,取出子节点并到父节点上,并动态更改数据长度,这样无限循环处理json取出所有id menuIdInit () { var _this = this; var _menu = _this.menus; var menuId = []; var len = _menu.length; for(var i = 0; i <

使用jsonpath解析多层嵌套的json响应信息

Python自带的json库可以把请求转为字典格式, 但在多层嵌套的字典中取值往往要进行多次循环遍历才能取到相应的数据, 如: res_dict = { "code": 0, "msg": "成功", "data": { "users": [ {"name": "张三", "gender": "male", "age&

.net 提取多层嵌套的JSON

Newtonsoft.Json.Net20.dll 下载请访问http://files.cnblogs.com/hualei/Newtonsoft.Json.Net20.rar 在.net 2.0中提取这样的json {"name":"lily","age":23,"addr":{"city":guangzhou,"province":guangdong}} 引用命名空间 using N

EasyUI DataGrid绑定嵌套的json数据

现有json数据如下: {"total":2,"rows": [{"BarrackGUID":"dc1be891-4489-4eb8-bb1d-ba1debd59b07","BarrackName":"屋舍一","BarrackNumber":"0001","BarrackArea":"100平米",&quo

两层嵌套的JSON包的解法

由于后台的变态,有时候会出现两层甚至多层嵌套的JSON包. 一层的很好解,而且我看过一些比较大的网站新闻接口返回的JSON包也仅仅是一层的. 比如下图所示一层的包 代码也很简单直观 dict = [data objectFromJSONData]; // 这里可能会转换失败,还需要接着做判断 _dinnArray = [[NSMutableArray alloc] init]; _dataArray = [dict objectForKey:@"data"]; for (NSDicti

通过Gson解析Json数据

Json是一种数据格式,便于数据传输.存储.交换:Gson是一种组件库,可以把java对象数据转换成json数据格式. gson.jar的下载地址:http://search.maven.org/#search%7Cga%7C1%7Ca%3A%22gson%22 一.Json数据样式 为了便于理解我们先来看看Json的数据样式: 1. 单个数据对象 { "id": 100, "body": "It is my post", "numbe

Flink SQL 解析复杂(嵌套)JSON

在 Flink 1.10 的 Table API 和 SQL 中,表支持的格式有四种: CSV Format JSON Format Apache Avro Format Old CSV Format 官网地址如下:https://ci.apache.org/projects/flink/flink-docs-release-1.10/dev/table/connect.html#table-formats 我用 JSON Format  比较多,也有嵌套的JSON 数据需要解析,大概描述一下.

多层嵌套json类型数据解析

前段时间写了一个多层嵌套json数据对象,费了半天劲,记录一下 前端数据类似淘宝多条件搜索,json数据类型为key-value嵌套数组 前端为ajax传值 function searfunc(arr) { //arr为查询按钮之后输出的搜索条件 console.log(arr); $.ajax({ url:'/conprob/titleList', type:'post', contentType: "application/json", traditional: true, asy