`
w582875929
  • 浏览: 2172 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Java JSON 解析

 
阅读更多

 介绍: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解析的简单测试,简单示例

    Java Json解析,Java Web Json解析,Java Web服务端获取Json数据,客户端通过HTTP获取Json数据

    Java JSON解析是Web开发中的重要技能,特别是在Java Web服务端和客户端之间传递数据时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其易于人阅读和编写,同时也易于机器解析和生成,被广泛...

    java JSON 解析

    java JSON 解析 保证生成的JSON是有序结构,代码取至Android源码。

    JAVA JSON 解析

    "JAVA JSON 解析" JAVA 中 JSON 格式数据解析是指在 Java 语言中对 JSON 格式的数据进行解析和处理。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于 ECMAScript 编程语言,易于人来阅读和...

    java json解析

    ### Java JSON解析概述 JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在Java中处理JSON数据,通常涉及两个主要步骤:获取JSON数据和解析JSON数据。获取数据可以通过网络请求或...

    Java Json解析

    Java作为后端开发的主流语言,提供了多种库来处理JSON解析,如Jackson、Gson、org.json等。本篇文章将详细探讨Java中的JSON解析,以及如何在服务端生成JSON数据并由客户端通过HTTP请求获取。 首先,让我们关注Java...

    Java JSON解析依赖JAR(JSON LIB)

    用于解析Java JSON,里面的包有不少是根据链接收集的,但发现仍然不能完整执行。 经检查还是缺少commons-collections-3.2.1.jar这个包(过高的版本,如4.5不支持Json Lib)。 包名录如下: json-lib-2.2-jdk15.jar ...

    java json解析 jar 包

    总的来说,Java中的JSON解析jar包为我们提供了便利的数据交换手段,使我们能够轻松地处理JSON数据。理解并熟练使用这些库,可以极大地提升开发效率和项目的可维护性。在实际工作中,根据项目需求和团队成员的熟悉...

    json类库,Java解析json必用

    本篇文章将深入探讨Java中解析和生成JSON的类库,并介绍如何使用它们进行数据转换。 ### JSON的基本结构 JSON基于JavaScript语法,但并不依赖JavaScript执行环境。其基本结构包括对象(Object)和数组(Array)。...

    java 解析 json文件 java 解析 json文件

    一、JSON解析库 1. Jackson:Jackson是Java中最流行的JSON处理库之一,提供了多种API用于序列化和反序列化JSON。使用Jackson的`com.fasterxml.jackson.databind.ObjectMapper`类可以轻松地将JSON字符串转换为Java...

    java解析json包

    Java解析JSON包主要涉及到的是如何在Java程序中处理JSON(JavaScript Object Notation)数据,这是一种轻量级的数据交换格式,广泛应用于服务器与客户端之间的数据通信。JSON格式易于人阅读和编写,同时也易于机器...

    Java json 解析json.jar

    用Java编程语言进行编码和解码JSON对象所需要的jar包。。

    java解析JSON数据

    使用该方法可以轻松解析JSON数组,方便取出JSON数据

    java解析json的jar包

    本主题主要讨论的jar包包括`json-lib`、`commons-beanutils`和`commons-collections`,这些都是Java JSON解析的常用库。首先,让我们深入了解这些库的功能和用途。 1. **json-lib**:这是一个多功能的JSON库,支持...

    java json互转demo

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在Java中,我们可以使用各种库来实现JSON与Java对象间的相互转换,JSON-LIB是其中的一个库。下面我们...

    java FASTJSON 解析复杂JSON实例源码

    总之,Fastjson是Java开发中处理JSON数据的理想选择,其强大的功能和高效的性能使得它可以轻松应对各种复杂的JSON解析和序列化任务。通过`JSONTest`这样的示例代码,我们可以更好地理解和掌握如何利用Fastjson进行...

    在J2ME环境下把JSON解析为Hashtable

    【JSON解析为Hashtable在J2ME环境中的应用】 在Java ME(J2ME)环境中,由于资源限制,我们不能直接使用Java SE中的HashMap或ArrayList。在这种情况下,使用Hashtable和Vector作为数据容器是理想的选择,因为它们是...

    json的解析jar包

    总的来说,这个"json的解析jar包"是为了帮助Java开发者更方便地处理JSON数据,无论是解析从服务器接收到的JSON响应,还是将本地数据结构转化为JSON格式发送出去,都是必不可少的工具。在使用前,需要了解具体包含的...

    JAVA解析JSON数据代码需要的多个jar包

    以下是一些常用的Java JSON解析库以及它们的使用方法: 1. **Jackson** Jackson是Java社区中最流行的JSON解析库之一,它提供了高效的性能和丰富的功能。要使用Jackson,你需要引入`jackson-databind.jar`,`...

Global site tag (gtag.js) - Google Analytics