当一个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. javascript继承扩展类方法实现

    javascript没有原生的继承语法,这确实很让人困惑,但是广大人民群从的智慧是无穷的.最近呢,正尝到一点从源码中学习的甜头,不分享一下实在难以平复激动的心情.前不久改造视频播放插件的时候,找到了v ...

  2. Designing CSS Layouts With Flexbox Is As Easy As Pie

    This article is an updated excerpt of the chapter “Restyle, Recode, Reimagine With CSS3″ from our Sm ...

  3. 关于sql语句的优化问题

    系统要求进行SQL优化,对效率比较低的SQL进行优化,使其运行效率更高,其中要求对SQL中的部分in/not in修改为exists/not exists 修改方法如下: in的SQL语句 SELEC ...

  4. Java虚拟机(JVM)中的内存设置详解

    在一些规模稍大的应用中,Java虚拟机(JVM)的内存设置尤为重要,想在项目中取得好的效率,GC(垃圾回收)的设置是第一步. PermGen space:全称是Permanent Generation ...

  5. JAVA生成验证码

    <img border="0"                             src="ValidateCode"                ...

  6. swift文件上传及表单提交

    var carData:NSMutableDictionary = NSMutableDictionary(); var request:NSMutableURLRequest = NSMutable ...

  7. Apache和mysql的安装设置

    Apache和mysql的安装较简单,主要是安装前请保证80端口未被占用 比如 iis 以前安装过的apache mysql 先停止运行phpmyadmin,主要是配置文件的问题,把phpMyAdmi ...

  8. gnuplotx轴的logscale显示

    假设数据是这样子的: gnuplot脚本如下: set terminal postscript eps color enhanced set log x set log y set format x ...

  9. php扩展redis,编译安装redis服务

    首先安装redis扩展 https://github.com/phpredis/phpredis 下载http://redis.io/download 服务软件 cd到软件存放目录unzip phpr ...

  10. Apache Spark源码走读之7 -- Standalone部署方式分析

    欢迎转载,转载请注明出处,徽沪一郎. 楔子 在Spark源码走读系列之2中曾经提到Spark能以Standalone的方式来运行cluster,但没有对Application的提交与具体运行流程做详细 ...