介绍:java 解析 json字符串
支持数据格式:String、int、Integer、double、Double、boolean、Boolean、BigDecimal、List、Map
Map key 需为 String
引用数据类型的解析需要 传递映射 Map<String,Class> 其中 key为对象中的属性名
package com.json; /** * 定义 json 解析器 * Created by wangxin on 2015/2/14. */ public interface JsonParser { /** * @param jsonStr * @return */ public JsonResponse parse(String jsonStr) throws Exception; }
package com.json.parser; import com.json.JsonParser; import com.json.JsonResponse; import net.sf.json.JSONArray; import net.sf.json.JSONException; import net.sf.json.JSONObject; import java.lang.reflect.Method; import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; /** * 简单对象解析, 节点均为基础数据类型/Bigdecimal 的对象 * Created by wangxin on 2015/3/12. */ public class SimpleObjectParser implements JsonParser { private static final String TAG = SimpleObjectParser.class.getSimpleName(); private Class<? extends JsonResponse> responseType; private Map<String, Class> typeClass; /** * 简单类型转换 目前支持的类型 * 支持的集合类有 List Map * Map 的 key值 必须为 string */ private static interface ClassType { String STRING = "class java.lang.String"; String INT = "int"; String INTEGER = "class java.lang.Integer"; String DOUBLE = "double"; String DOUBLE_CLASS = "class java.lang.Double"; String BOOLEAN = "boolean"; String BOOLEAN_CLASS = "class java.lang.Boolean"; String BIGDECIMAL = "java.math.BigDecimal"; } public SimpleObjectParser(Class<? extends JsonResponse> responseType) { this.responseType = responseType; } public SimpleObjectParser(Class<? extends JsonResponse> responseType, Map<String, Class> typeClass) { this.responseType = responseType; this.typeClass = typeClass; } @Override public JsonResponse parse(String jsonStr) throws Exception { try { JSONObject json = JSONObject.fromObject(jsonStr); return (JsonResponse) parse(json, responseType); } catch (Exception e) { // LogUtil.e(TAG, "pase error:" + jsonStr); throw e; } } /** * 解析, JSONObject 对应成 指定的 类型 * * @param json * @param classType * @return * @throws IllegalAccessException * @throws InstantiationException */ private Object parse(JSONObject json, Class classType) throws IllegalAccessException, InstantiationException { if (null == classType) return null; Method[] methods = classType.getMethods(); Object result = classType.newInstance(); for (Method m : methods) { if (!m.getName().startsWith("set") || m.getParameterTypes().length != 1) continue; try { Object param = parseParam(m.getParameterTypes()[0], getPropertyName(m.getName()), json); if (null != param) m.invoke(result, param); } catch (Exception e) { continue; } } return result; } /** * 从 json 对象中获取 属性值 * * @param type * @param propertyName * @param json * @return */ private Object parseParam(Class type, String propertyName, JSONObject json) throws JSONException { Object param = null; String typeStr = type.toString(); if (typeStr.equals(ClassType.STRING)) param = json.getString(propertyName); else if (typeStr.equals(ClassType.INT) || typeStr.equals(ClassType.INTEGER)) param = json.getInt(propertyName); else if (typeStr.equals(ClassType.DOUBLE) || typeStr.equals(ClassType.DOUBLE_CLASS)) param = json.getDouble(propertyName); else if (typeStr.equals(ClassType.BOOLEAN) || typeStr.equals(ClassType.BOOLEAN_CLASS)) param = json.getBoolean(propertyName); else if (typeStr.equals(ClassType.BIGDECIMAL)) param = new BigDecimal(json.getString(propertyName)); else if (List.class.isAssignableFrom(type)) param = parseList(json, propertyName, type); else if (Map.class.isAssignableFrom(type)) param = parseMap(json, propertyName, type); else if (typeStr.startsWith("class ")) param = parseObject(json, propertyName); return param; } /** * 根据 set 方法名获得属性名称 * * @param methodName * @return */ private String getPropertyName(String methodName) { methodName = methodName.substring(3); return methodName.substring(0, 1).toLowerCase() + methodName.substring(1); } /** * 解析 list * * @return */ private List parseList(JSONObject json, String propertyName, Class type) { try { JSONArray jsonArray = json.getJSONArray(propertyName); List result = type.isInterface() ? new ArrayList() : (List) type.newInstance(); Object param; for (int i = 0; i < jsonArray.size(); i++) { try { param = parse(jsonArray.getJSONObject(i), typeClass.get(propertyName)); if (null == param) param = jsonArray.get(i); result.add(param); } catch (JSONException e) { result.add(jsonArray.get(i)); } } return result; } catch (Exception e) { return null; } } /** * 解析 map * * @param json * @param propertyName * @param type * @return */ private Map parseMap(JSONObject json, String propertyName, Class type) { try { Map map = type.isInterface() ? new HashMap() : (Map) type.newInstance(); JSONObject jsonObj = json.getJSONObject(propertyName); Iterator<String> keys = jsonObj.keys(); String key; Object param; while (keys.hasNext()) { key = keys.next(); try { param = parse(jsonObj.getJSONObject(key), typeClass.get(propertyName)); if (null != param) param = jsonObj.get(key); map.put(key, param); } catch (JSONException e) { map.put(key, jsonObj.get(key)); } } return map; } catch (Exception e) { return null; } } /** * 解析 JavaBean * * @param json * @param propertyName * @return */ private Object parseObject(JSONObject json, String propertyName) { try { if (null == typeClass || typeClass.get(propertyName) == null) return null; JSONObject jsonObject = json.getJSONObject(propertyName); return parse(jsonObject, typeClass.get(propertyName)); } catch (Exception e) { return null; } } }
相关推荐
关于java json解析的简单测试,简单示例
Java JSON解析是Web开发中的重要技能,特别是在Java Web服务端和客户端之间传递数据时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其易于人阅读和编写,同时也易于机器解析和生成,被广泛...
java JSON 解析 保证生成的JSON是有序结构,代码取至Android源码。
"JAVA JSON 解析" JAVA 中 JSON 格式数据解析是指在 Java 语言中对 JSON 格式的数据进行解析和处理。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于 ECMAScript 编程语言,易于人来阅读和...
### Java JSON解析概述 JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在Java中处理JSON数据,通常涉及两个主要步骤:获取JSON数据和解析JSON数据。获取数据可以通过网络请求或...
Java作为后端开发的主流语言,提供了多种库来处理JSON解析,如Jackson、Gson、org.json等。本篇文章将详细探讨Java中的JSON解析,以及如何在服务端生成JSON数据并由客户端通过HTTP请求获取。 首先,让我们关注Java...
用于解析Java JSON,里面的包有不少是根据链接收集的,但发现仍然不能完整执行。 经检查还是缺少commons-collections-3.2.1.jar这个包(过高的版本,如4.5不支持Json Lib)。 包名录如下: json-lib-2.2-jdk15.jar ...
总的来说,Java中的JSON解析jar包为我们提供了便利的数据交换手段,使我们能够轻松地处理JSON数据。理解并熟练使用这些库,可以极大地提升开发效率和项目的可维护性。在实际工作中,根据项目需求和团队成员的熟悉...
本篇文章将深入探讨Java中解析和生成JSON的类库,并介绍如何使用它们进行数据转换。 ### JSON的基本结构 JSON基于JavaScript语法,但并不依赖JavaScript执行环境。其基本结构包括对象(Object)和数组(Array)。...
一、JSON解析库 1. Jackson:Jackson是Java中最流行的JSON处理库之一,提供了多种API用于序列化和反序列化JSON。使用Jackson的`com.fasterxml.jackson.databind.ObjectMapper`类可以轻松地将JSON字符串转换为Java...
Java解析JSON包主要涉及到的是如何在Java程序中处理JSON(JavaScript Object Notation)数据,这是一种轻量级的数据交换格式,广泛应用于服务器与客户端之间的数据通信。JSON格式易于人阅读和编写,同时也易于机器...
用Java编程语言进行编码和解码JSON对象所需要的jar包。。
使用该方法可以轻松解析JSON数组,方便取出JSON数据
本主题主要讨论的jar包包括`json-lib`、`commons-beanutils`和`commons-collections`,这些都是Java JSON解析的常用库。首先,让我们深入了解这些库的功能和用途。 1. **json-lib**:这是一个多功能的JSON库,支持...
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在Java中,我们可以使用各种库来实现JSON与Java对象间的相互转换,JSON-LIB是其中的一个库。下面我们...
总之,Fastjson是Java开发中处理JSON数据的理想选择,其强大的功能和高效的性能使得它可以轻松应对各种复杂的JSON解析和序列化任务。通过`JSONTest`这样的示例代码,我们可以更好地理解和掌握如何利用Fastjson进行...
【JSON解析为Hashtable在J2ME环境中的应用】 在Java ME(J2ME)环境中,由于资源限制,我们不能直接使用Java SE中的HashMap或ArrayList。在这种情况下,使用Hashtable和Vector作为数据容器是理想的选择,因为它们是...
总的来说,这个"json的解析jar包"是为了帮助Java开发者更方便地处理JSON数据,无论是解析从服务器接收到的JSON响应,还是将本地数据结构转化为JSON格式发送出去,都是必不可少的工具。在使用前,需要了解具体包含的...
以下是一些常用的Java JSON解析库以及它们的使用方法: 1. **Jackson** Jackson是Java社区中最流行的JSON解析库之一,它提供了高效的性能和丰富的功能。要使用Jackson,你需要引入`jackson-databind.jar`,`...