很多时候我们见到的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. int(*p)[]和int(**p)[]

    1. int(*p)[10]: 根据运算符的结合律,()的优先级最高,所以p是一个指针,指向的一个维度为10的一维数组. p一个指向数组的某一行 int a[1][4]={1,2,3,4}; int ...

  2. (NO.00003)iOS游戏简单的机器人投射游戏成形记(十一)

    机器人发射子弹已经完成了,下面看看怎么给玩家设置障碍. 大家从上篇的图可以看到,在机器和篮筐直接有若干障碍物.我们先看如何实现它们. 打开SpriteBuilder,在Sprites文件夹中新建Sma ...

  3. Leetcode_7_Reverse Integer

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41578077 Reverse Integer Revers ...

  4. [Ext.Net]客户关系管理系统

    本人在企业中非专业人士,交流学习. 1.登录 2.系统主界面 3.用户与角色 3.菜单管理 4.角色与授权 5.登陆日志 6.简易工作流 7.客户分类 8.客户管理 9.报价管理 业务员反馈 报价明细 ...

  5. react-native-android之初次相识

    作为一名Android开发者,我的感觉就是,一步一卡,卡的潇洒. 但是我还是要学react-native,不要问我为什么,因为我相信一门解决了原生app,开发周期长,开发成本高,升级代价大的语言一定会 ...

  6. 【翻译】在Ext JS应用程序中使用自定义图标

    原文:Using Custom Icons in Your Ext JS App 作者:Lee BoonstraLee is a technical trainer at Sencha. She's ...

  7. git remote

    在git里,服务器上的仓库在本地称之为remote. 直接clone一个仓库: $: git clone git@search.ued.taobao.net:projects/search.git 另 ...

  8. Vim/Vi实用技巧(第二版)

    Vim/Vi实用技巧 1.导入文件 :r [文件名] #导入到当前编辑的文件中 如 :r /etc/inittab 文件上部为/etc/services文件,下部为/etc/inittab文件 2.执 ...

  9. MIDlet工作原理

    题记 :  现在的J2ME用户已经是日益减少 , 开发也在转型! 无奈之下也不得不写下这系列文章来别了j2me ,也是对过去的一些总结吧! ①: 所有Kjava必须会继承自javax.microedi ...

  10. OpenCV矩阵运算

    矩阵处理 1.矩阵的内存分配与释放 (1) 总体上: OpenCV 使用C语言来进行矩阵操作.不过实际上有很多C++语言的替代方案可以更高效地完成. 在OpenCV中向量被当做是有一个维数为1的N维矩 ...