当一个Class的字段属性中包含另一个class时gson能正常处理吗? 最初看到网上有说使用static的说法 经验证是不需要的 直接当普通类来用就可以了。

直接使用gson.fromJson方法即可。

以下为测试代码

import java.io.Serializable;
@SuppressWarnings("serial")
public class House implements Serializable {
public House() {
} private int ID;
private String HouseName;
private String HouseNo;
private Integer State;
private Integer ParentID;
private Integer UserID;
private String Remark;
private Long UpSB;
private Integer AgentID; private HousePars Pars;
private CtrMP3 Mp3;
private ZigbeeSB Zigbeesb; /**
* 主键ID
*/
public final void setID(int value) {
ID = value;
} public final int getID() {
return ID;
} /**
* 名称
*/
public final void setHouseName(String value) {
HouseName = value;
} public final String getHouseName() {
return HouseName;
} /**
* 房间编号
*/
public final void setHouseNo(String value) {
HouseNo = value;
} public final String getHouseNo() {
return HouseNo;
} /**
* 状态
*/
public final void setState(Integer value) {
State = value;
} public final Integer getState() {
return State;
} /**
* 上级区域
*/
public final void setParentID(Integer value) {
ParentID = value;
} public final Integer getParentID() {
return ParentID;
} /**
* 所属用户
*/
public final void setUserID(Integer value) {
UserID = value;
} public final Integer getUserID() {
return UserID;
} public final void setRemark(String value) {
Remark = value;
} public final String getRemark() {
return Remark;
} /**
* 客户编号
*
* @return
*/
public Integer getAgentID() {
return AgentID;
} public void setAgentID(Integer agentID) {
AgentID = agentID;
} /**
* 协调器地址
*
* @return
*/
public Long getUpSB() {
return UpSB;
} public void setUpSB(Long upSB) {
UpSB = upSB;
} public HousePars getPars() {
return Pars;
} public void setPars(HousePars pars) {
Pars = pars;
} public CtrMP3 getMp3() {
return Mp3;
} public void setMp3(CtrMP3 mp3) {
Mp3 = mp3;
} public ZigbeeSB getZigbeesb() {
return Zigbeesb;
} public void setZigbeesb(ZigbeeSB zigbeesb) {
Zigbeesb = zigbeesb;
} }

上述类中 CtrMP3 ,ZigbeeSB,HousePars 都是单独的类

从JSON转为java对象方法

Json举例(实际上是WEB服务自动转化而来的)

{"d":{"__type":"Model.House","Zigbeesb":{"__type":"IntelligenceFactory.Model.ZigbeeSB","MacHex":"D7D15702004B1200","ID":69,"Jiange":7098850,"MacAddrstr":"D7D15702004B1200","ParentMacstr":"D7D15702004B1200","RootMacstr":"0000000000000000","MacAddr":-2895437419316047360,"Name":"协调器","ModelNo":null,"UserID":1,"ParentMac":-2895437419316047360,"RootMac":0,"IsMain":true,"Description":"","SortIndex":null,"Signal":255,"LastTime":"\/Date(1389414412000)\/","Type":null,"HouseID":23,"Remark":"7098850","AgentID":1},"Mp3":{"__type":"Model.CtrMP3","Jiange":null,"ID":19,"Name":"播放器2","MacAddr":null,"NameCode":"114","MacID":null,"UserID":null,"HouseID":1,"Type":null,"State":1,"LastTime":null,"Position":"","Direction":"","Value1":1,"Value2":2,"Value3":null,"Value4":null,"Value5":null,"Value6":null,"OtherValue":"","Remark":"","LinkState":null,"AgentID":1},"Pars":{"ID":1,"HouseID":23,"State1":0,"State2":null,"OtherState":"","Pars1":"2","Pars2":"10","OthePars":"","LastTime":null,"Description":"测试房间MP3"},"MacID":null,"ID":23,"HouseName":"admin","HouseNo":"02","State":1,"ParentID":null,"UserID":1,"Remark":"","UpSB":-2895437419316047360,"AgentID":1}}
/**
* 获取当前房间参数信息
*
* @param houseid 房间ID
* @param hashmap 成功失败标志
* @return 返回House参数信息
* @throws UnsupportedEncodingException
* @throws JSONException
*/
@SuppressWarnings("finally")
public static House GetHousePars(int houseid,
HashMap<String, Integer> hashmap)
throws UnsupportedEncodingException, JSONException {
Log.i(tag, STRUrl);
int flag = 0;
House ur = null;
String tag = "httppost";
Log.i(tag, "获取房间信息");
// 设置服务地址
String Url = STRUrl + "InteWebService.asmx/GetHouse";
HttpPost request = new HttpPost(Url);// 定义一个HTTP请求
request.addHeader("Content-Type", "application/json; charset=utf-8");// 设置返回的内容为json格式
// Post参数传递 JSON格式
JSONObject jsonParams = new JSONObject();
jsonParams.put("houseid", houseid);// 传参,如果想传递两个参数则继续添加第二个参数jsonParams.put("param2Name","param2Value")
Log.i(tag, "houseid=" + houseid);
HttpEntity bodyEntity = new StringEntity(jsonParams.toString(), "utf8");// 参数必须也得是JSON数据格式的字符串才能传递到服务器端,否则会出现"{'Message':'strName是无效的JSON基元'}"的错误
request.setEntity(bodyEntity);
HttpClient httpClient = new DefaultHttpClient();
String res = "";
try {
Log.i(tag, "开始执行请求GetHousePars");
Log.i(tag, Url);
HttpResponse response = httpClient.execute(request);
int state = response.getStatusLine().getStatusCode();
Log.i(tag, "返回状态" + state);
if (state == 200) {
// 200表示连接成功 404 连接失败
Log.i(tag, "状态200连接成功");
HttpEntity entity = response.getEntity();// 获取返回结果
res = EntityUtils.toString(entity);
Log.i(tag, res);
GsonBuilder gsonb = new GsonBuilder();
// Json中的日期表达方式没有办法直接转换成我们的Date类型, 因此需要单独注册一个Date的反序列化类.
DateDeserializer ds = new DateDeserializer();
// 给GsonBuilder方法单独指定Date类型的反序列化方法
gsonb.registerTypeAdapter(java.util.Date.class, ds);
Gson gson = gsonb.create();
JSONObject resultJSON = new JSONObject(res);
String data = resultJSON.get("d").toString();
Log.i(tag, data);
if ("null" != data) {
Log.i(tag, "返回不为null开始转换");
// 登录成功 返回用户信息 注意时间格式的提取
ur = gson.fromJson(data, House.class);
if (ur != null) {
flag = 1;
hashmap.put("flag", flag);
return ur;
}
} else {
// 没有返回用户信息
Log.i(tag, "返回为null");
flag = 0;// 房间信息不存在
hashmap.put("flag", flag);
} } else {
flag = 2;// 网络连接异常
hashmap.put("flag", flag);
Log.i("httppost", "连接失败"
+ response.getStatusLine().getStatusCode());
} } catch (Exception e) {
flag = -1;// 程序异常
hashmap.put("flag", flag);
Log.i("httppost", "获取信息异常" + e.getMessage());
} finally {
hashmap.put("flag", flag);
Log.i("httppost", "关闭try");
return ur;
}
}

接收后直接按普通嵌套类使用即可。

Android笔记:gson处理多层嵌套的复杂形式的json的更多相关文章

  1. 【Android自定义控件】支持多层嵌套RadioButton的RadioGroup

    前言 非常喜欢用RadioButton+RadioGroup做Tabs,能自动处理选中等效果,但是自带的RadioGroup不支持嵌套RadioButton(从源码可看出仅仅是判断子控件是不是Radi ...

  2. Gson 解析多层嵌套JSON数据

    http://stackoverflow.com/questions/14139437/java-type-generic-as-argument-for-gson

  3. Android 动态生成布局 (多层嵌套)

    Android 除了能够载入xml文件,显示布局外,也能够代码生成布局,并通过setContentView(View view)方法显示布局.单独的一层布局,如一个主布局加一个控件(如Button\i ...

  4. android listView多层嵌套listView显示不全问题

    最近在做项目,需要用到listVIew多层嵌套listVIew的需求,先发现已下两个处理办法比较好用 第一种: public class ListViewNesting extends ListVie ...

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

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

  6. fastjson排序 Map多层嵌套转换自动排序问题终极解决方案

    阅读更多 最近项目中用到了fastjson(1.2.15)需要将前端多层嵌套json转换为map,由于map的无序性,想了很多办法,最终找到使用 Map m= JSONArray.parseObjec ...

  7. 【SpringBoot】 Java中如何封装Http请求,以及JSON多层嵌套解析

    前言 本文中的内容其实严格来说不算springboot里面的特性,属于JAVA基础,只是我在项目中遇到了,特归纳总结一下. HTTP请求封装 目前JAVA对于HTTP封装主要有三种方式: 1. JAV ...

  8. ASP.NET提取多层嵌套json数据的方法

    本文实例讲述了ASP.NET利用第三方类库Newtonsoft.Json提取多层嵌套json数据的方法,具体例子如下. 假设需要提取的json字符串如下: {"name":&quo ...

  9. 元素多层嵌套,JS获取问题

    如果一段html嵌套过多,在js中获取还是比较麻烦的,我写了几套方案,大家可以参考参考,如果你有好的方法,也分享出来,让我们瞧瞧. HTML: <!DOCTYPE html> <ht ...

随机推荐

  1. [iOS] UIImage和CGImageRef

    CGImageRef并不是面向对象的API,也不是类,只是一个指针类型,Quartz 2D对CGImageRef的定义为: typedef struct CGImage *CGImageRef; 由此 ...

  2. 【BZOJ】1468: Tree(点分治)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1468 分治真是一门高大上的东西... 好神... 树分治最好资料是:qzc的<分治算法在树的路 ...

  3. 【TYVJ】1359 - 收入计划(二分)

    http://tyvj.cn/Problem_Show.aspx?id=1359 一开始是一眼看出是二分的,因为这里有单调性,因为取钱是一次取完并且是连续的. 所以最优取法就是准备达到某个价值再取.最 ...

  4. POJ 1691 Painting A Board(迭代深搜)

    题目链接 调了一上午,单步的效率太低了,特别是在有递归的情况下...下午来了,输出调试了下,就发现bug了,各种混乱啊. 比较高兴的事,1Y了.本来还准备用edge1优化一下的,结果完全没用到.. # ...

  5. mysql多种方法修改密码----5.6的坑

    创建用户并授权和改密码: grant all privileges on *.* to root@'%' identified by '123456' with grant option;     * ...

  6. Windows下PHPUnit安装

    收藏的介绍地址 1.手动方式安装示例:http://blog.sina.com.cn/s/blog_5d3dc0110100ghlo.html2.通过Pear安装示例:blog.sina.com.cn ...

  7. RAID 容量计算器

    https://www.synology.com/zh-cn/support/RAID_calculator   磁盘阵列比较表   n/2 n/2 n n/2 安全性高 综合RAID 0/1优点,理 ...

  8. OpenStack手动从数据库中删除实例 - ugyn109的专栏 - 博客频道 - CSDN.NET

    由于某种原因我将OpenStack的一个计算节点移除了,但移除前并没有删除在其上运行的实例,后来想通过dash删除这些实例,于是N天过去了,我的dash还显示如下内容:很碍眼是不是?于是我打算手动从数 ...

  9. ERROR com.opensymphony.xwork2.interceptor.ParametersInterceptor.error:34 - Developer Notification

    We are trying to migrate from Struts 2.2 to Struts 2.3, after getting to run the project I am seeing ...

  10. Nginx 笔记与总结(14)expires 缓存设置

    设置缓存,可以提高网站性能. 当网站的部分内容,比如新闻站的图片,一旦发布就不太可能发生更改,此时需要用户在访问一次页面之后,把该页面的图片缓存在用户的浏览器端一段时间,就可以用到 nginx 的 e ...