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

{"name":"桔子桑",
"sex":"男",
"age":,
"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[]的集合。

注意:由于大多数人都是对sql语句很熟悉,而对于hql语句不太熟悉,所以用hibernate框架查询的时候,

有必要进行以下操作:

String sql = "select s.sname,g.gname from student as s inner join grade as g on s.gid = g.gid WHERE s.sex = ? ";
Query query = session.createSQLQuery(sql);
query.setParameter(, "男");
List<Object[]> listDB = query.list();

这样就显式地告诉hibernate执行sql查询,而不是hql查询,

这两种查询还是有区别的,有时候sql语句放到hql查询里面执行是会出现错误的。

2.新建javaBean

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

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

就会出现下面相同的情况,因为只查询了sname和gname字段,

那么没查的字段在student实体类中则显示为空、0、[]

[
{"grade":{"gdesc":"","gid":,"gname":"java","students":[]},
"sex":"",
"sid":,"sname":"桔子桑"},
{"grade":{"gdesc":"","gid":,"gname":"java","students":[]},
"sex":"",
"sid":,
"sname":"eco"},
{"grade":{"gdesc":"","gid":,"gname":"java","students":[]},
"sex":"",
"sid":,
"sname":"官方"}
]

所以我觉得有必要根据查询字段新建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[];
String sex = (String) object[];
String age = (String) object[];
String gname = (String) object[];
String gdesc = (String) object[];
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); //json字符串转json数组
Object[] arr = jsonArray.toArray(); //json数组转普通Object数组
for (Object o : arr) { //遍历这个Object数组
JSONObject jsonObject = JSONObject.fromObject(o);//数组项(Object)转json对象
Student stu = (Student) JSONObject
.toBean(jsonObject, Student.class); //json对象转javaBean对象
System.out.println(stu.getSname()); //访问javaBean对象的成员变量
}

注意:遍历的时候,这个o是不能直接强转Student对象的,虽然Myeclipse不会在你写代码的时候报错,

但是,运行的时候,会对这种强转报以下错误:

net.sf.json.JSONObject cannot be cast to eco.aaa.Student

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

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

    1. jsonpath介绍用来解析多层嵌套的json数据;JsonPath 是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,包括:Javascript, Python, ...

  2. 接口自动化多层嵌套的json数据处理

    最近在做接口自动化测试,响应的内容大多数是多层嵌套的json数据,在对响应数据进行校验的时候,可以通过(key1.key2.key3)形式获取嵌套字典值的方法获取响应值,再和预期值比较 def get ...

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

    已知一个多层嵌套的json,取出所有父元素和子元素的id值 思路:因为不知道到底嵌套了多少层,递归有可能造成栈溢出.查询时间特别久的问题 所以先查询一次,判断是否有子节点,如果有,取出子节点并到父节点 ...

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

    Python自带的json库可以把请求转为字典格式, 但在多层嵌套的字典中取值往往要进行多次循环遍历才能取到相应的数据, 如: res_dict = { "code": 0, &q ...

  5. .net(c#)提取多层嵌套的JSON

    Newtonsoft.Json.Net20.dll 下载请访问http://files.cnblogs.com/hualei/Newtonsoft.Json.Net20.rar 在.net 2.0中提 ...

  6. JSON的简单使用之提取多层嵌套的JSON(C#)

    JSON.NET(http://json.codeplex.com/)使用来将.NET中的对象转换为JSON字符串(序列化?),或者将JSON字符串转换为.NET中已有类型的对象(反序列化?) 反序列 ...

  7. 关于对多层嵌套的json字符串取目标值的问题

    import java.util.HashMap;import java.util.Iterator;import java.util.Map;import net.sf.json.JSONObjec ...

  8. 关于多重嵌套的JSON数据解析

    最近项目中需要封装一套复杂的数据模型返回给前端,大致就是一个用户会有多笔订单,每个订单下可能会有多笔保单, 大致的数据模型如下: 为了方面描述,先看一下一个用户下有一条订单,一条订单下有一个保险订单的 ...

  9. 两层嵌套的JSON包的解法

    由于后台的变态,有时候会出现两层甚至多层嵌套的JSON包. 一层的很好解,而且我看过一些比较大的网站新闻接口返回的JSON包也仅仅是一层的. 比如下图所示一层的包 代码也很简单直观 dict = [d ...

随机推荐

  1. Linux的文件系统及其硬盘分区挂载原理

    如果您是一位新手,也许 您还不知道如何把文件从Windows拷贝到Linux上吧?下面,我们将说明Unix文件系统以及mount的工作过程,然后再比较详细地讨论. mount的使用和有关选项.如果您已 ...

  2. Android Studio查看应用数字签名-android学习之旅(76)

    Android Studio和Eclispe还是有比较大的区别,在这地方,eclipse可以直接在设置里面,而AS就需要通过Terminal来查看 步骤 1.首先定位到.android 一般都是在C盘 ...

  3. 【一天一道LeetCode】#63. Unique Paths II

    一天一道LeetCode (一)题目 Follow up for "Unique Paths": Now consider if some obstacles are added ...

  4. (五十一)KVC与KVO详解

    KVC的全称为key value coding,它是一种使用字符串间接更改对象属性的方法. 假设有一个Person类和一个Student类,其中Person类有age.name两个属性,Student ...

  5. AngularJS进阶(三十四)Angular数据更新不及时问题探讨

    Angular数据更新不及时问题探讨 前言 在修复控制角标正确变化过程中,发觉前端代码组织层次出现了严重问题.传递和共享数据时自己使用的是rootScope,为此造成了全局变量空间的污染.根据< ...

  6. Android轶事之View要去大保健?View大小自己决定?

    -"爹,我要吃糖" -"好哒儿子" -"爹,我要吃包包" - "好哒儿子" - "爹,我要吃串串" ...

  7. Linux C系统编程:信号与定时器的使用

    #include <stdio.h> #include <signal.h> void do_alarm(int num); int main(void) { //注册一个定时 ...

  8. 网站开发进阶(二十四)HTML颜色代码表

    HTML颜色代码表 设置背景色:style='background-color:red' 设置字体颜色:style='color:red' 生活在于学习,知识在于积累.

  9. 浅谈我为什么选择用Retrofit作为我的网络请求框架

    比较AsyncTask.Volley.Retrofit三者的请求时间 使用 单次请求 7个请求 25个请求 AsyncTask 941ms 4539ms 13957ms Volley 560ms 22 ...

  10. UE4 Hello World 创建第一个UE4工程

    首先先熟悉几个UE4常用的类 AGameMode(控制整个项目的逻辑) The GameMode defines the game being played. It governs thegame r ...