`

利用帮助类和内部类简化JSON处理

    博客分类:
  • Java
阅读更多

在处理 JSON 的过程中, 往往要面对着解析和转换 ,异常处理的问题 。

普通的处理流程 :

 

        HttpClient client = new HttpClient();
        String strUrl = CommonConstant.getBatchShowAssociationURL() + parm;
        PostMethod method = new PostMethod(strUrl);
        List<AssociationVO> associationList = new ArrayList<AssociationVO>();
        try {
            client.executeMethod(method);
        } catch (HttpException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        String returnJson = "";
        try {
            returnJson = method.getResponseBodyAsString();// 返回json字符串值
            String strJson = returnJson.replace("?(", "").replace(")", "").replace(";", "");
            if (strJson.startsWith("{")) {
                JSONObject jsonObject = JSONObject.fromObject(strJson);
                String code = jsonObject.getString("code").toString();
                if ("200".equals(code)) {
                    JSONArray jsonArray = JSONArray.fromObject(jsonObject.get("result"));
                    for (int i = 0, len = jsonArray.size(); i < len; i++) {
                        AssociationVO vo = new AssociationVO();
                        JSONObject jsonClub = jsonArray.getJSONObject(i);
                        vo.setId(Long.valueOf(jsonClub.get("id").toString()));
                        associationList.add(vo);
                    }
                }
            }
        } catch (Exception e1) {
            e1.printStackTrace();
        } finally {
            // 使用完成后要释放链接
            method.releaseConnection();
        }

 

这样的处理每次都要定义 处理方法, 负责打开和关闭流 ,

 

如果处理的是规则的接口,返回的数据都是相对固定的字段,可以考虑

利用自己定义的帮助类和接口实现的内部类,能够极大简化, 可以直接得到类。

 

 首先是远程接口类, 调用得到JSON字串。。

 

public class RemoteRepositoryImpl implements RemoteRepository {


	public String executePost(String url, Entity...requestBody) throws RemoteException {
		PostMethod method = getPostMethod(url);
		if (requestBody!=null && requestBody.length>0) {
			method.setRequestBody(requestBody);
		}
		return execute(method);
	}


	protected PostMethod getPostMethod(String url) {
		PostMethod method = new PostMethod(url);
		method.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 5000); //设置 post 方法请求超时为 15 秒
		method.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
		return method;
	}



	public String execute(HttpMethodBase httpMethod) throws RemoteException {
		HttpClient client = new HttpClient();
		client.getHttpConnectionManager().getParams().setConnectionTimeout(5000);//设置 http 连接超时为 10 秒
		String url = "";
		long logT1 = System.currentTimeMillis();
		try {
			url = "" + httpMethod.getURI();
			int sc = client.executeMethod(httpMethod);
            if (sc != HttpStatus.SC_OK && sc!=HttpStatus.SC_CREATED && sc!=HttpStatus.SC_ACCEPTED) {
                throw new RemoteException("remote service ERROR! methodstatus=[" + sc + "]" + url, "HttpStatus");
            }
            return httpMethod.getResponseBodyAsString();
		} catch (URIException e) {
			throw new RemoteException("URIException remote service ERROR!" + url, "URIException", e);
		} catch (HttpException e) {
			throw new RemoteException("HttpException remote service ERROR!" + url, "HttpException", e);
		} catch (IOException e) {
			throw new RemoteException("IOException remote service ERROR!" + url, "IOException", e);
		} catch (RuntimeException e) {
			throw new RemoteException("RuntimeException","RuntimeException" , e);
		} finally {
			httpMethod.releaseConnection();
			long logT2 = System.currentTimeMillis();
			if (logger.isInfoEnabled()) {
				logger.info("Remote Time " + (logT2 - logT1) + " millisecounds:" + url);
			}
		}	
	}

}

 

在得到结果之后, 把返回字符串放到 JSON 包装类对象中去。 

 

public class JSONWrapper {

	protected JSONObject root;
	private String json;
	/**
	 * 构造
	 * @param json
	 */
	public JSONWrapper(String json) {
		json = json.replaceAll("\\n", "");
		this.json = json;
		String validJson = (json);
		if (validJson!=null) {
		    root = (JSONObject) JSONSerializer.toJSON((json));
		}else {
		    root = new JSONObject(true);
		}
	}

   private JSONWrapper(JSONObject json) {
       this.json = "";
        root = json;
    }
	/**
	 * 静态工厂
	 * @param json
	 * @return
	 */
	public static JSONWrapper valueOf(String json) {
		return new JSONWrapper(json);
	}


    private static <E> List<E> getJavaList(Object bean, String path,  ToJava<E> tojava){
		Object p = getProperty(bean, path);
		if (p==null) {
			return Collections.emptyList();
		}
		if (!(p instanceof JSON)) {// TODO trycache
			return Collections.emptyList();
//			throw new RuntimeException("path 路径错误,请检查:[" + p + "]不是一个JSON对象");
		}
		JSON jo = (JSON) p;
		List<E> res = new ArrayList<E>(jo.size());
		Collection arr = (jo instanceof JSONObject) ? ((JSONObject) jo).values() : (JSONArray) jo;
		JSONWrapper subWrapper = new JSONWrapper((JSONObject)null);
		for (Object obj : arr) {
			if (!(obj instanceof JSONObject)) {
			    logger.error("path 路径错误,请检查:[" + obj + "]不是一个JsonObject对象");
			    continue;
				//throw new RemoteException("path 路径错误,请检查:[" + obj + "]不是一个JsonObject对象", "json");
			}
			if (((JSONObject) obj).isNullObject()) {
				continue;
			}
			try {
			    subWrapper.root = (JSONObject) obj;
                E o = tojava.toJava(subWrapper);
                if (o!=null) {
                	res.add(o);
                }
            } catch (RuntimeException e) {
                logger.error("取tojava异常");
                //throw new RemoteException("取tojava异常", "json", e);
            }
		}
		return res;
	}


	//根据路径得到 JSON 对象
	private static Object getProperty(Object jo, String path) {
		if (StringUtils.hasText(path)) {
			for (String prop : path.split("\\.")) {
				if (jo==null) {
					return null;
				}
				if (jo instanceof JSONObject) {
					jo = getJSONObject((JSONObject) jo, prop);
				}
			}	
		}
		return jo;
	}


 	protected static Object getJSONObject(JSONObject jo, String propName) {
  	                return jo!=null && !jo.isNullObject()? jo.get(propName) : null;
 	}


}

 

 通用的接口类 :

 

public interface ToJava<E>{
	E toJava(JSONWrapper wrapper);
}

 

这样,就可以使用内部类来得到JSON中的数据了

 

public class BusinessCircleServiceImpl implements BusinessCircleService {



    protected ToAssociationVO toAssociationVO = new ToAssociationVO();

    //内部实现类
    protected static class ToAssociationVO implements ToJava<AssociationVO> {
        public AssociationVO toJava(JSONWrapper wrapper) {
            AssociationVO vo = new AssociationVO();
            vo.setId(wrapper.getLong("id", null));
            vo.setTimeCreated(DateTimeUtils.formatPageDate(DateTimeUtils.parseFullDateTime(DateUtil
                    .getDateTimeByMillisecond(wrapper.getString("timeCreated", null)))));
            return vo;
        }
    }



    public List<AssociationVO> getRecommandList(int type, PaginationDto paginationDto) {

     ..................................
        //调用代码:

          try {
           String strJson = remoteRepository.executeGet(CommonConstant.getBatchShowAssociationURL() + ids);
           return JSONWrapper.valueOf(strJson).getJavaList("result", toAssociationVO);
          } catch (RemoteException e) {
           log.error("远程服务出错:" + CommonConstant.getBatchShowAssociationURL() + ids, e);
           return Collections.EMPTY_LIST;
          }






    }



  
}

 

 

 

分享到:
评论
1 楼 Jason(aijun) 2011-05-09  
写的很好,怎么没有评论。吴总...................

相关推荐

    JSON和C#类代码互相转换工具

    在实际应用中,这样的工具可以帮助开发者快速地在JSON和C#类之间切换,简化数据操作,提高开发效率。同时,它也展示了C#如何利用强大的库(如Json.NET)来处理JSON数据,以及如何处理语言间的互操作性问题。 由于本...

    封装了qt的json操作类QtSharpJson.zip

    然而,"QtSharpJson.zip"提供的内容是对Qt原生JSON支持的进一步封装,旨在简化JSON操作并提高效率。 标题"封装了qt的json操作类QtSharpJson.zip"表明这个压缩包包含了一个名为QtSharpJson的自定义库,这个库是对Qt ...

    swift-macapp根据json字符串创建模型类自动判断类型

    `swift-macapp根据json字符串创建模型类自动判断类型`是一个针对这个问题的解决方案,它帮助开发者更高效地实现JSON到Swift模型类的转换。 首先,Swift提供了一个内置的JSONSerialization类,用于处理JSON数据。...

    JSON 类库使用的jar包

    标签中提到的“源码”可能指的是这些JSON库的源代码开放,开发者可以查看和研究其内部实现,这对于学习和优化JSON处理效率非常有帮助。“工具”则暗示了这些库是开发中的实用工具,能够简化JSON操作。 综上所述,...

    Json.net源代码

    通过源代码,我们可以了解这些类是如何实现的,以及如何利用它们来简化JSON数据的解析和操作。 7. **注解和属性** JSON.NET支持使用特性(如`[JsonProperty]`、`[JsonIgnore]`)来自定义序列化过程。源代码展示了...

    json所需所有jar包

    4. **commons-beanutils-1.7.0.jar**:Apache Commons BeanUtils库,提供了一些方便的工具类,帮助在JavaBean对象和JSON对象之间进行映射,简化了数据转换的过程。 这些jar包组合在一起,可以构建一个完整的JSON...

    JsonUtils(Json转换工具类)

    `JsonUtils`应该有适当的异常处理机制,当出现错误时,能够抛出易于理解和处理的异常,而不是简单的运行时异常。 7. **性能优化**: 高效是工具类的一个重要考量因素。`JsonUtils`通常会利用缓存技术,对于频繁...

    json lib jdk

    6. **与其他技术集成**:JSON Lib可以与Spring框架、Struts等其他Java技术无缝集成,简化JSON数据的处理。 总之,JSON Lib是Java开发中处理JSON数据的一个强大工具,尤其是在JDK 1.5环境下,它提供了稳定和高效的...

    Json.NET_Demo.zip

    Json.NET还提供了XML和JSON之间的转换功能,`JsonConvert.SerializeXmlNode()`和`JsonConvert.DeserializeXmlNode()`方法分别用于XML到JSON和JSON到XML的转换。 8. **性能优势** 相比其他.NET框架下的JSON库,...

    json2.4 jar包

    总之,`json2.4 jar包`是一个功能丰富的Java JSON处理库,它简化了JSON在Java应用程序中的操作,无论是用于网络通信、数据存储还是其他需要JSON转换的场景,都能提供强大的支持。通过源代码文件,开发者可以更好地...

    C# Newtonsoft.Json.dll 源码

    开发者可以通过继承JsonConverter并实现WriteJson和ReadJson方法,自定义特定类型的序列化和反序列化逻辑。这使得Newtonsoft.Json可以处理自定义类型或复杂的数据结构。 7. **动态Json**:Json.Linq支持 ...

    Struct2利用Ajax,JQuery交互Json

    例如,创建一个Action类,定义一个方法,该方法使用@Result注解指定返回类型为json,然后在方法内部将Java对象转换成Json字符串,如使用Fastjson或Gson库进行转换。 在前端,使用JQuery的Ajax方法发起请求到Struct2...

    json4s-scalaz_2.11-3.2.9.zip

    JSON4S是一个在Scala编程语言中处理JSON的开源库,其设计目的是为了简化JSON的序列化和反序列化过程。这个库提供了多种JSON实现,包括一个与Scalaz库集成的版本,即“json4s-scalaz”。Scalaz是一个扩展了Scala标准...

    JSON帮助工具

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛用于前后端数据传输。...理解JSON的基本结构和常用处理方法,以及如何利用工具类进行操作,对于任何涉及JSON的开发工作都是必不可少的技能。

    JSON 解析工具

    总的来说,JSON解析工具是开发过程中的得力助手,它简化了JSON数据的查看和处理,提升了开发效率,对于理解和调试JSON数据具有重要作用。通过深入理解这些工具的工作原理和功能,开发者可以更好地利用它们来优化自己...

    grib2json-master.zip

    这个工具的出现极大地简化了对GRIB2数据的分析和可视化,尤其是对于那些熟悉JavaScript和JSON的开发者来说。 项目的核心在于一个名为`grib2json.js`的脚本,该脚本实现了GRIB2到JSON的转换逻辑。用户可以通过在终端...

    基于Vue的JSON可视化编辑器通过定义JSONSchema直接生成UI界面

    5. **处理数据**:在组件内部,你需要处理JSON数据的增删改查,并同步到UI上。 6. **样式定制**:根据需求,可以使用CSS预处理器(如Sass或Less)对生成的UI进行样式定制。 7. **交互逻辑**:添加事件监听器以响应...

    json2pb master

    通过“json2pb master”,开发者可以有效地在JSON和protobuf之间架起桥梁,充分利用两者的优势,提升系统的性能和效率。无论是快速原型开发还是大型项目部署,这样的工具都能极大地简化数据转换的工作,提高开发效率...

    jackson-2.4.2.jar(包含3个Jar) 高性能的JSON处理

    最后,jackson-databind利用这些注解来实现自动的序列化和反序列化,使得处理JSON数据变得简单高效。 总结一下,Jackson 2.4.2版本的这三个JAR文件是Java开发者处理JSON数据的强大工具。它们结合了流式处理、注解...

    Json字符串美化格式化软件

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛用于Web应用程序之间传递数据。它基于JavaScript的一个子集,格式简洁...通过合理利用这类工具,开发者可以在面对复杂JSON数据时更加游刃有余。

Global site tag (gtag.js) - Google Analytics