一个通用的Json解析框架接口设计(二)- 实现

157 篇文章 5 订阅
8 篇文章 0 订阅

https://gitee.com/xxssyyyyssxx/Json-fastjson

https://gitee.com/xxssyyyyssxx/Json-orgJson

https://gitee.com/xxssyyyyssxx/Json-Gson

https://gitee.com/xxssyyyyssxx/Json-Jackson

https://gitee.com/xxssyyyyssxx/Json-Jsonlib

后续打算实现一些高级特性,比如FastJson、Gson的注解等

  1. fastjson实现
package cn.zytx.common.json.impl;

import cn.zytx.common.json.Json;
import cn.zytx.common.json.JsonArray;
import cn.zytx.common.json.JsonObject;
import com.alibaba.fastjson.JSON;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author xiongshiyan at 2018/6/10
 */
public class JSONObject extends BaseJson<JSONObject> implements JsonObject {

    private com.alibaba.fastjson.JSONObject jsonObject;

    public JSONObject(com.alibaba.fastjson.JSONObject jsonObject){
        this.jsonObject = jsonObject;
    }
    public JSONObject(Map<String , Object> map){
        this.jsonObject = new com.alibaba.fastjson.JSONObject(map);
    }
    public JSONObject(){
        this.jsonObject = new com.alibaba.fastjson.JSONObject();
    }
    public JSONObject(String jsonString){
        this.jsonObject = JSON.parseObject(jsonString);
    }

    @Override
    public com.alibaba.fastjson.JSONObject unwrap() {
        return jsonObject;
    }

    @Override
    public Object get(String key) {
        assertKey(key);
        return checkNullValue(key , jsonObject.get(key));
    }

    @Override
    public Object get(String key, Object defaultObject) {
        assertKey(key);
        Object temp = jsonObject.get(key);
        return null == temp ? defaultObject : temp;
    }

    @Override
    public JsonObject getJsonObject(String key) {
        assertKey(key);
        //这里不能使用getJSONObject,因为每一种Json实现不一样,给出的JsonObject类型是不一致的。
        //这里就是各种JsonObject不能混用的原因
        Object temp = this.jsonObject.get(key);
        Object t = checkNullValue(key, temp);

        if(t instanceof com.alibaba.fastjson.JSONObject){
            return new JSONObject((com.alibaba.fastjson.JSONObject) t);
        }
        if(t instanceof Map){
            return new JSONObject((Map<String, Object>) t);
        }

        return (JsonObject) t;
    }

    @Override
    public JsonArray getJsonArray(String key) {
        assertKey(key);
        //这里不能使用getJSONObject,因为每一种Json实现不一样,给出的JsonObject类型是不一致的。
        //这里就是各种JsonObject不能混用的原因
        Object temp = this.jsonObject.get(key);
        Object t = checkNullValue(key, temp);

        if(t instanceof com.alibaba.fastjson.JSONArray){
            return new JSONArray((com.alibaba.fastjson.JSONArray)t);
        }
        if(t instanceof List){
            return new JSONArray((List<Object>) t);
        }
        return (JsonArray) t;
    }

    @Override
    public String getString(String key) {
        assertKey(key);
        String temp = this.jsonObject.getString(key);
        return checkNullValue(key, temp);
    }

    @Override
    public String getString(String key, String defaultValue) {
        assertKey(key);
        String temp = this.jsonObject.getString(key);
        return null == temp ? defaultValue : temp;
    }

    @Override
    public Boolean getBoolean(String key) {
        assertKey(key);
        Boolean temp = this.jsonObject.getBoolean(key);
        return checkNullValue(key, temp);
    }

    @Override
    public Boolean getBoolean(String key, Boolean defaultValue) {
        assertKey(key);
        Boolean temp = this.jsonObject.getBoolean(key);
        return null == temp ? defaultValue : temp;
    }

    @Override
    public Integer getInteger(String key) {
        assertKey(key);
        Integer temp = this.jsonObject.getInteger(key);
        return checkNullValue(key, temp);
    }

    @Override
    public Integer getInteger(String key, Integer defaultValue) {
        assertKey(key);
        Integer temp = this.jsonObject.getInteger(key);
        return null == temp ? defaultValue : temp;
    }

    @Override
    public Long getLong(String key) {
        assertKey(key);
        Long temp = this.jsonObject.getLong(key);
        return checkNullValue(key, temp);
    }

    @Override
    public Long getLong(String key, Long defaultValue) {
        assertKey(key);
        Long temp = this.jsonObject.getLong(key);
        return null == temp ? defaultValue : temp;
    }

    @Override
    public Float getFloat(String key) {
        assertKey(key);
        Float temp = this.jsonObject.getFloat(key);
        return checkNullValue(key, temp);
    }

    @Override
    public Float getFloat(String key, Float defaultValue) {
        assertKey(key);
        Float temp = this.jsonObject.getFloat(key);
        return null == temp ? defaultValue : temp;
    }

    @Override
    public Double getDouble(String key) {
        assertKey(key);
        Double temp = this.jsonObject.getDouble(key);
        return checkNullValue(key, temp);
    }

    @Override
    public Double getDouble(String key, Double defaultValue) {
        assertKey(key);
        Double temp = this.jsonObject.getDouble(key);
        return null == temp ? defaultValue : temp;
    }

    @Override
    public BigInteger getBigInteger(String key) {
        assertKey(key);
        BigInteger temp = this.jsonObject.getBigInteger(key);
        return checkNullValue(key, temp);
    }

    @Override
    public BigInteger getBigInteger(String key, BigInteger defaultValue) {
        assertKey(key);
        BigInteger temp = this.jsonObject.getBigInteger(key);
        return null == temp ? defaultValue : temp;
    }

    @Override
    public BigDecimal getBigDecimal(String key) {
        assertKey(key);
        BigDecimal temp = this.jsonObject.getBigDecimal(key);
        return checkNullValue(key, temp);
    }

    @Override
    public BigDecimal getBigDecimal(String key, BigDecimal defaultValue) {
        assertKey(key);
        BigDecimal temp = this.jsonObject.getBigDecimal(key);
        return null == temp ? defaultValue : temp;
    }

    @Override
    public <T> T get(String key, Class<T> clazz) {
        return jsonObject.getObject(key , clazz);
    }

    @Override
    public Set<String> keySet() {
        return jsonObject.keySet();
    }

    @Override
    public int size() {
        return jsonObject.size();
    }

    @Override
    public boolean isEmpty() {
        return jsonObject.isEmpty();
    }

    @Override
    public boolean containsKey(String key) {
        return jsonObject.containsKey(key);
    }

    @Override
    public boolean containsValue(Object value) {
        return jsonObject.containsValue(value);
    }

    @Override
    public JsonObject put(String key, Object value) {
        jsonObject.put(key, value);
        return this;
    }

    @Override
    public JsonObject putAll(Map<? extends String, ?> m) {
        jsonObject.putAll(m);
        return this;
    }

    @Override
    public void clear() {
        jsonObject.clear();
    }

    @Override
    public Object remove(String key) {
        return jsonObject.remove(key);
    }

    @Override
    public JsonObject parse(String jsonString) {
        jsonObject = JSON.parseObject(jsonString);
        return this;
        //return new JSONObject(JSON.parseObject(jsonString));
    }

    @Override
    public JsonObject fromMap(Map<String, Object> map) {
        return new JSONObject(new com.alibaba.fastjson.JSONObject(map));
    }

    @Override
    public String serialize(Object javaBean) {
        return JSON.toJSONString(javaBean);
    }

    @Override
    public <T> T deserialize(String jsonString, Class<T> clazz) {
        return JSON.parseObject(jsonString , clazz);
    }

    @Override
    public String toString() {
        //需要针对JsonObject/JsonArray处理
        Map<String , Json> map = new HashMap<>();
        for (String key : jsonObject.keySet()) {
            Object o = jsonObject.get(key);
            if(o instanceof JsonObject || o instanceof JsonArray){
                map.put(key , (Json) o);
            }
        }
        map.forEach((k , v)-> jsonObject.put(k , v.unwrap()));

        return jsonObject.toString();
    }

    @Override
    public int hashCode() {
        return jsonObject.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        return jsonObject.equals(obj);
    }

}
package cn.zytx.common.json.impl;

import cn.zytx.common.json.Json;
import cn.zytx.common.json.JsonArray;
import cn.zytx.common.json.JsonObject;
import com.alibaba.fastjson.JSON;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author xiongshiyan at 2018/6/11
 */
public class JSONArray extends BaseJson<JSONArray> implements JsonArray {
    private com.alibaba.fastjson.JSONArray jsonArray;
    public JSONArray(com.alibaba.fastjson.JSONArray jsonArray){
        this.jsonArray = jsonArray;
    }
    public JSONArray(List<Object> list){
        this.jsonArray = new com.alibaba.fastjson.JSONArray(list);
    }
    public JSONArray(){
        this.jsonArray = new com.alibaba.fastjson.JSONArray();
    }
    public JSONArray(String arrayString){
        this.jsonArray = JSON.parseArray(arrayString);
    }
    @Override
    public int size() {
        return jsonArray.size();
    }

    @Override
    public Object get(int index) {
        assertIndex(index , size());
        return checkNullValue(index , jsonArray.get(index));
    }

    @Override
    public String getString(int index) {
        assertIndex(index , size());
        return checkNullValue(index , jsonArray.getString(index));
    }

    @Override
    public Boolean getBoolean(int index) {
        assertIndex(index , size());
        return checkNullValue(index , jsonArray.getBoolean(index));
    }

    @Override
    public Integer getInteger(int index) {
        assertIndex(index , size());
        return checkNullValue(index , jsonArray.getInteger(index));
    }

    @Override
    public Long getLong(int index) {
        assertIndex(index , size());
        return checkNullValue(index , jsonArray.getLong(index));
    }

    @Override
    public Double getDouble(int index) {
        assertIndex(index , size());
        return checkNullValue(index , jsonArray.getDouble(index));
    }

    @Override
    public Float getFloat(int index) {
        assertIndex(index , size());
        return checkNullValue(index , jsonArray.getFloat(index));
    }

    @Override
    public BigInteger getBigInteger(int index) {
        assertIndex(index , size());
        return checkNullValue(index , jsonArray.getBigInteger(index));
    }

    @Override
    public BigDecimal getBigDecimal(int index) {
        assertIndex(index , size());
        return checkNullValue(index , jsonArray.getBigDecimal(index));
    }

    @Override
    public JsonObject getJsonObject(int index) {
        assertIndex(index , size());
        Object opt = jsonArray.get(index);
        if(opt instanceof com.alibaba.fastjson.JSONObject){
            return new JSONObject((com.alibaba.fastjson.JSONObject)opt);
        }
        if(opt instanceof Map){
            return new JSONObject((Map<String, Object>) opt);
        }
        return (JsonObject) opt;
    }

    @Override
    public JsonArray getJsonArray(int index) {
        assertIndex(index , size());
        Object opt = jsonArray.get(index);
        if(opt instanceof com.alibaba.fastjson.JSONArray){
            return new JSONArray((com.alibaba.fastjson.JSONArray)opt);
        }
        if(opt instanceof List){
            return new JSONArray((List)opt);
        }
        return (JsonArray) opt;
    }

    @Override
    public JsonArray remove(int index) {
        jsonArray.remove(index);
        return this;
    }

    @Override
    public JsonArray clear() {
        jsonArray.clear();
        return this;
    }

    @Override
    public JsonArray put(Object o) {
        jsonArray.add(o);
        return this;
    }

    @Override
    public JsonArray put(int index, Object o) {
        jsonArray.remove(index);
        jsonArray.add(index , o);
        return this;
    }

    @Override
    public JsonArray putAll(Collection<?> os) {
        jsonArray.addAll(os);
        return this;
    }

    @Override
    public JsonArray parse(String jsonString) {
        this.jsonArray = JSON.parseArray(jsonString);
        return this;
        //return new JSONArray(JSON.parseArray(jsonString));
    }

    @Override
    public com.alibaba.fastjson.JSONArray unwrap() {
        return jsonArray;
    }

    @Override
    public String toString() {
        //需要针对JsonObject/JsonArray处理
        Map<Integer , Json> map = new HashMap<>();
        int size = size();
        for (int i = 0; i < size; i++) {
            Object o = jsonArray.get(i);
            if(o instanceof JsonObject || o instanceof JsonArray){
                map.put(i , (Json) o);
            }
        }
        map.forEach((k,v)->{
            jsonArray.remove((int)k);
            jsonArray.add((int)k , v.unwrap());
        });

        return jsonArray.toString();
    }

    @Override
    public int hashCode() {
        return jsonArray.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        return jsonArray.equals(obj);
    }

    @Override
    public JsonArray fromList(List<Object> list) {
        jsonArray = new com.alibaba.fastjson.JSONArray(list);
        return this;
    }
}

通用测试方法:

package cn.zytx.common.json;

import cn.zytx.common.json.impl.JSONObject;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
 * 使用的时候不会出现跟具体JSON框架耦合的代码
 */
public class JSONObjectTest {

    JsonObject jsonObject = new JSONObject();

    @Before
    public void init(){
        jsonObject.put("k1","v1");
        jsonObject.put("k2","v2");
        jsonObject.put("boolean1",true);
        jsonObject.put("integer1",1);
        jsonObject.put("long1",1L);
        jsonObject.put("double1",1D);
        jsonObject.put("float1",1F);
        jsonObject.put("bigInteger1",new BigInteger("1"));
        jsonObject.put("bigDecimal1",new BigDecimal("1"));

        JSONObject object = new JSONObject();
        object.put("k1" , "v1");
        jsonObject.put("k3", new JSONObject(object.unwrap()));
    }

    @Test
    public void get() throws Exception {
        Assert.assertEquals("v1" , jsonObject.get("k1"));
        jsonObject.setStrict(false);
        Assert.assertNull(jsonObject.get("k4"));
    }

    @Test
    public void getDefault() throws Exception {
        Assert.assertEquals("v2" , jsonObject.get("k2" , "kv2"));
        Assert.assertEquals("kv2" , jsonObject.get("k4" , "kv2"));
    }

    @Test
    public void getJsonObject() throws Exception {
        JsonObject k3 = jsonObject.getJsonObject("k3");
        Assert.assertEquals("v1" , k3.getString("k1"));
    }

    @Test
    public void getJsonArray() throws Exception {
    }

    @Test
    public void getString() throws Exception {
        String v1 = jsonObject.getString("k1");
        Assert.assertEquals("v1" , v1);
    }

    @Test
    public void getStringDefault() throws Exception {
        String v1 = jsonObject.getString("k1" , "vv");
        Assert.assertEquals("v1" , v1);

        String v4 = jsonObject.getString("k4" , "vv");
        Assert.assertEquals("vv" , v4);
    }

    @Test
    public void getBoolean() throws Exception {
        Boolean boolean1 = jsonObject.getBoolean("boolean1");
        Assert.assertEquals(true , boolean1);
    }

    @Test
    public void getBooleanDefault() throws Exception {
        Boolean boolean1 = jsonObject.getBoolean("boolean1" , false);
        Assert.assertEquals(true, boolean1);

        Boolean v4 = jsonObject.getBoolean("k4" , false);
        Assert.assertEquals(false , v4);
    }

    @Test
    public void getInteger() throws Exception {
        Integer integer1 = jsonObject.getInteger("integer1");
        Assert.assertEquals((Integer) 1 , integer1);
    }

    @Test
    public void getIntegerDefault() throws Exception {
        Integer integer1 = jsonObject.getInteger("integer1" , 1);
        Assert.assertEquals((Integer) 1, integer1);

        Integer v4 = jsonObject.getInteger("k4" , 2);
        Assert.assertEquals((Integer) 2 , v4);
    }

    @Test
    public void getLong() throws Exception {
        Long long1 = jsonObject.getLong("long1");
        Assert.assertEquals(Long.valueOf(1) , long1);
    }

    @Test
    public void getLongDefault() throws Exception {
        Long long1 = jsonObject.getLong("long1" , 1L);
        Assert.assertEquals((Long)1L, long1);

        Long v4 = jsonObject.getLong("k4" , 2L);
        Assert.assertEquals(Long.valueOf(2) , v4);
    }

    @Test
    public void getFloat() throws Exception {
        Float float1 = jsonObject.getFloat("float1");
        Assert.assertEquals(Float.valueOf(1) , float1);
    }

    @Test
    public void getFloatDefault() throws Exception {
        Float float1 = jsonObject.getFloat("float1" , 1F);
        Assert.assertEquals(Float.valueOf(1), float1);

        Float v4 = jsonObject.getFloat("k4" , 2F);
        Assert.assertEquals(Float.valueOf(2) , v4);
    }

    @Test
    public void getDouble() throws Exception {
        Double double1 = jsonObject.getDouble("double1");
        Assert.assertEquals(Double.valueOf(1) , double1);
    }

    @Test
    public void getDoubleDefault() throws Exception {
        Double double1 = jsonObject.getDouble("double1" , 1D);
        Assert.assertEquals((Double) 1D, double1);

        Double v4 = jsonObject.getDouble("k4" , 2D);
        Assert.assertEquals(Double.valueOf(2) , v4);
    }

    @Test
    public void getBigInteger() throws Exception {
        BigInteger bigInteger1 = jsonObject.getBigInteger("bigInteger1");
        Assert.assertEquals(new BigInteger("1") , bigInteger1);
    }

    @Test
    public void getBigIntegerDefault() throws Exception {
        BigInteger bigInteger1 = jsonObject.getBigInteger("bigInteger1" , new BigInteger("2"));
        Assert.assertEquals(new BigInteger("1") , bigInteger1);

        BigInteger v4 = jsonObject.getBigInteger("k4" , new BigInteger("2"));
        Assert.assertEquals(new BigInteger("2") , v4);
    }

    @Test
    public void getBigDecimal() throws Exception {
        BigDecimal bigDecimal1 = jsonObject.getBigDecimal("bigDecimal1");
        Assert.assertEquals(new BigDecimal("1") , bigDecimal1);
    }

    @Test
    public void getBigDecimalDefault() throws Exception {
        BigDecimal bigDecimal1 = jsonObject.getBigDecimal("bigDecimal1" , new BigDecimal("2"));
        Assert.assertEquals(new BigDecimal("1") , bigDecimal1);

        BigDecimal v4 = jsonObject.getBigDecimal("k4" , new BigDecimal("2"));
        Assert.assertEquals(new BigDecimal("2") , v4);
    }

    @Test
    public void getClassObj() throws Exception {
        String k1 = jsonObject.get("k1", String.class);
        Assert.assertEquals("v1" , k1);
    }

    @Test
    public void keySet() throws Exception {
        Set<String> keySet = jsonObject.keySet();
        System.out.println(keySet);
    }

    @Test
    public void size() throws Exception {
        Assert.assertEquals(10 , jsonObject.size());
    }

    @Test
    public void isEmpty() throws Exception {
        Assert.assertFalse(jsonObject.isEmpty());
    }

    @Test
    public void containsKey() throws Exception {
        Assert.assertTrue(jsonObject.containsKey("k1"));
        Assert.assertFalse(jsonObject.containsKey("k5"));
    }

    @Test
    public void containsValue() throws Exception {
        Assert.assertTrue(jsonObject.containsValue("v1"));
        Assert.assertFalse(jsonObject.containsValue("vv"));
    }

    @Test
    public void put() throws Exception {
        JsonObject put = jsonObject.put("k4", "v4");
        Assert.assertEquals(11 , jsonObject.size());
        Assert.assertEquals(11 , put.size());
        Assert.assertEquals("v4" , jsonObject.getString("k4"));
        Assert.assertEquals("v4" , put.getString("k4"));
    }

    @Test
    public void putAll() throws Exception {
        Map<String , Object> map = new HashMap<>(2);
        map.put("k5" , "v5");
        map.put("k6" , "v6");
        JsonObject putAll = this.jsonObject.putAll(map);
        Assert.assertEquals(12 , jsonObject.size());
        Assert.assertEquals(12 , putAll.size());

        Assert.assertEquals("v5" , jsonObject.getString("k5"));
        Assert.assertEquals("v6" , jsonObject.getString("k6"));
        Assert.assertEquals("v5" , putAll.getString("k5"));
        Assert.assertEquals("v6" , putAll.getString("k6"));
    }

    @Test
    public void clear() throws Exception {
        jsonObject.clear();
        Assert.assertEquals(0 , jsonObject.size());
    }

    @Test
    public void remove() throws Exception {
        Object k1 = jsonObject.remove("k1");
        Assert.assertEquals(9 , jsonObject.size());
    }

    @Test
    public void parse() throws Exception {
        JsonObject parse = jsonObject.parse("{\"xx\":\"ss\" , \"ss\":{\"cc\":12}}");
        Assert.assertEquals("{\"ss\":{\"cc\":12},\"xx\":\"ss\"}" , parse.toString());
        Assert.assertEquals("{\"ss\":{\"cc\":12},\"xx\":\"ss\"}" , jsonObject.toString());
    }

    @Test
    public void serialize() throws Exception {
        FastJsonObjectBean javaBean = new FastJsonObjectBean();
        javaBean.setK1("11");
        String serialize = jsonObject.serialize(javaBean);
        System.out.println(serialize);
    }

    @Test
    public void deserialize() throws Exception {
        FastJsonObjectBean deserialize = jsonObject.deserialize("{\"k1\":\"11\"}", FastJsonObjectBean.class);
        System.out.println(deserialize);

        FastJsonObjectBean deserialize1 = jsonObject.deserialize("{\"bigDecimal1\":1,\"bigInteger1\":1,\"boolean1\":true,\"double1\":1,\"float1\":1,\"integer1\":1,\"k1\":\"v1\",\"k2\":\"v2\",\"k3\":{\"k1\":\"v1\"},\"long1\":1}", FastJsonObjectBean.class);
        System.out.println(deserialize1);
    }

    @Test
    public void testToString() throws Exception {
        System.out.println(jsonObject.toString());
    }

    @Test
    public void testConvert() throws Exception {
        JsonObject parse = jsonObject.parse("{\"bigDecimal1\":1,\"bigInteger1\":1,\"boolean1\":true,\"double1\":1,\"float1\":1,\"integer1\":1,\"k1\":\"v1\",\"k2\":\"v2\",\"k3\":{\"k1\":\"v1\"},\"long1\":1}");
        System.out.println(parse.toString());
    }
}
package cn.zytx.common.json;

import cn.zytx.common.json.impl.JSONArray;
import cn.zytx.common.json.impl.JSONObject;
import org.junit.Assert;
import org.junit.Test;

import java.util.Arrays;
import java.util.List;

/**
 * 使用的时候不会出现跟具体JSON框架耦合的代码
 */
public class JSONArrayTest {
    private JsonArray jsonArray = new JSONArray();
    @Test
    public void unwrap() throws Exception {
        Object unwrap = jsonArray.unwrap();
        Assert.assertEquals(com.alibaba.fastjson.JSONArray.class , unwrap.getClass());
    }

    @Test
    public void parse() throws Exception {
        String src = "[\"12\",\"13\"]";
        JsonArray array = jsonArray.parse(src);
        Assert.assertEquals(2 , jsonArray.size());
        Assert.assertEquals(2 , array.size());
    }

    @Test
    public void size() throws Exception {
        Assert.assertEquals(0 , jsonArray.size());
        jsonArray.put("12");
        Assert.assertEquals(1 , jsonArray.size());
    }

    @Test(expected = JsonException.class)
    public void get() throws Exception {
        jsonArray.setStrict(true);
        jsonArray.put("12");
        Assert.assertEquals("12" , jsonArray.get(0));

        jsonArray.get(1);
    }

    @Test
    public void getString() throws Exception {
        jsonArray.put("12");
        Assert.assertEquals("12" , jsonArray.getString(0));
    }

    @Test
    public void getBoolean() throws Exception {
    }

    @Test
    public void getInteger() throws Exception {
    }

    @Test
    public void getLong() throws Exception {
    }

    @Test
    public void getDouble() throws Exception {
    }

    @Test
    public void getFloat() throws Exception {
    }

    @Test
    public void getBigInteger() throws Exception {
    }

    @Test
    public void getBigDecimal() throws Exception {
    }

    @Test
    public void getJsonObject() throws Exception {
        JsonObject jsonObject = new JSONObject();
        jsonObject.put("k1" , "v1");
        jsonObject.put("k2" , "v2");
        jsonArray.put(jsonObject);
        Assert.assertEquals("{\"k1\":\"v1\",\"k2\":\"v2\"}" , jsonArray.getJsonObject(0).toString());
    }

    @Test
    public void getJsonArray() throws Exception {
        JsonArray array = new JSONArray();
        array.put("12");
        array.put("13");
        JsonArray array2 = new JSONArray();
        array2.put("122");
        array2.put("132");

        jsonArray.put(array);
        jsonArray.put(array2);
        Assert.assertEquals("[\"12\",\"13\"]" , jsonArray.getJsonArray(0).toString());

    }

    @Test
    public void remove() throws Exception {
        JsonArray array = new JSONArray();
        array.put("12");
        array.put("13");
        JsonArray array2 = new JSONArray();
        array2.put("122");
        array2.put("132");

        jsonArray.put(array);
        jsonArray.put(array2);

        jsonArray.remove(0);
        Assert.assertEquals("[[\"122\",\"132\"]]" , jsonArray.toString());
    }

    @Test
    public void clear() throws Exception {
        JsonArray array = new JSONArray();
        array.put("12");
        array.put("13");
        JsonArray array2 = new JSONArray();
        array2.put("122");
        array2.put("132");

        jsonArray.clear();
        Assert.assertEquals("[]" , jsonArray.toString());
    }

    @Test
    public void put() throws Exception {
        jsonArray.put("12");
        jsonArray.put("13");
        Assert.assertEquals(2 , jsonArray.size());
    }

    @Test
    public void putWithIndex() throws Exception {
        jsonArray.put("12");
        jsonArray.put(0 ,"13");
        Assert.assertEquals(1 , jsonArray.size());
        Assert.assertEquals("13" , jsonArray.getString(0));
    }

    @Test
    public void putAll() throws Exception {
        jsonArray.putAll(Arrays.asList("12","12","13","13"));
        Assert.assertEquals(String.class , jsonArray.get(0).getClass());
        Assert.assertEquals(4 , jsonArray.size());
    }

    @Test
    public void testToString() throws Exception {
        JsonObject jsonObject = new JSONObject();
        jsonObject.put("k1" , "v1");
        jsonObject.put("k2" , "v2");
        jsonArray.put(jsonObject);
        Assert.assertEquals("[{\"k1\":\"v1\",\"k2\":\"v2\"}]" , jsonArray.toString());
    }

    @Test
    public void testFromList() throws Exception {
        List<Object> list = Arrays.asList("12","21",12);
        JsonArray array = jsonArray.fromList(list);
        Assert.assertEquals("[\"12\",\"21\",12]" , array.toString());
    }
}


2.orgJson实现

 

package cn.zytx.common.json.impl;

import cn.zytx.common.json.Json;
import cn.zytx.common.json.JsonArray;
import cn.zytx.common.json.JsonException;
import cn.zytx.common.json.JsonObject;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author xiongshiyan at 2018/6/10
 */
public class JSONObject extends BaseJson<JSONObject> implements JsonObject {

    private org.json.JSONObject jsonObject;

    public JSONObject(org.json.JSONObject jsonObject){
        this.jsonObject = jsonObject;
    }
    public JSONObject(Map<String , Object> map){
        this.jsonObject = new org.json.JSONObject(map);
    }
    public JSONObject(){
        this.jsonObject = new org.json.JSONObject();
    }
    public JSONObject(String jsonString){
        this.jsonObject = new org.json.JSONObject(jsonString);
    }

    @Override
    public org.json.JSONObject unwrap() {
        return jsonObject;
    }

    @Override
    public Object get(String key) {
        assertKey(key);
        return checkNullValue(key , jsonObject.opt(key));
    }

    @Override
    public Object get(String key, Object defaultObject) {
        assertKey(key);
        Object temp = jsonObject.opt(key);
        return null == temp ? defaultObject : temp;
    }

    @Override
    public JsonObject getJsonObject(String key) {
        assertKey(key);
        //这里不能使用getJSONObject,因为每一种Json实现不一样,给出的JsonObject类型是不一致的。
        //这里就是各种JsonObject不能混用的原因
        Object temp = this.jsonObject.opt(key);
        Object t = checkNullValue(key, temp);

        if(t instanceof org.json.JSONObject){
            return new JSONObject((org.json.JSONObject) t);
        }
        if(t instanceof Map){
            return new JSONObject((Map<String, Object>) t);
        }
        return (JsonObject) t;
    }

    @Override
    public JsonArray getJsonArray(String key) {
        assertKey(key);
        //这里不能使用getJSONObject,因为每一种Json实现不一样,给出的JsonObject类型是不一致的。
        //这里就是各种JsonObject不能混用的原因
        Object temp = this.jsonObject.opt(key);
        Object t = checkNullValue(key, temp);

        if(t instanceof org.json.JSONArray){
            return new JSONArray((org.json.JSONArray)t);
        }
        if(t instanceof List){
            return new JSONArray((List)t);
        }
        return (JsonArray) t;
    }

    @Override
    public String getString(String key) {
        return getString(key , null);
    }

    @Override
    public String getString(String key, String defaultValue) {
        assertKey(key);
        boolean has = jsonObject.has(key);
        if(!has){
            return checkNullValue(key , defaultValue);
        }
        String temp;
        if(isTolerant()){
            temp = ValueCompatible.compatibleValue(this.jsonObject.get(key) , String.class);
        }else {
            temp = this.jsonObject.getString(key);
        }
        return temp;
    }

    @Override
    public Boolean getBoolean(String key) {
        return getBoolean(key , null);
    }

    @Override
    public Boolean getBoolean(String key, Boolean defaultValue) {
        assertKey(key);
        boolean has = jsonObject.has(key);
        if(!has){
            return checkNullValue(key , defaultValue);
        }
        Boolean temp;
        if(isTolerant()){
            temp = ValueCompatible.compatibleValue(this.jsonObject.get(key) , Boolean.class);
        }else {
            temp = this.jsonObject.getBoolean(key);
        }
        return temp;
    }

    @Override
    public Integer getInteger(String key) {
        return getInteger(key , null);
    }

    @Override
    public Integer getInteger(String key, Integer defaultValue) {
        assertKey(key);
        boolean has = jsonObject.has(key);
        if(!has){
            return checkNullValue(key , defaultValue);
        }
        Integer temp;
        if(isTolerant()){
            temp = ValueCompatible.compatibleValue(this.jsonObject.get(key) , Integer.class);
        }else {
            temp = this.jsonObject.getInt(key);
        }
        return temp;
    }

    @Override
    public Long getLong(String key) {
        return getLong(key , null);
    }

    @Override
    public Long getLong(String key, Long defaultValue) {
        assertKey(key);
        boolean has = jsonObject.has(key);
        if(!has){
            return checkNullValue(key , defaultValue);
        }
        Long temp;
        if(isTolerant()){
            temp = ValueCompatible.compatibleValue(this.jsonObject.get(key) , Long.class);
        }else {
            temp = this.jsonObject.getLong(key);
        }
        return temp;
    }

    @Override
    public Float getFloat(String key) {
        return getFloat(key , null);
    }

    @Override
    public Float getFloat(String key, Float defaultValue) {
        assertKey(key);
        boolean has = jsonObject.has(key);
        if(!has){
            return checkNullValue(key , defaultValue);
        }
        Float temp;
        if(isTolerant()){
            temp = ValueCompatible.compatibleValue(this.jsonObject.get(key) , Float.class);
        }else {
            temp = this.jsonObject.getFloat(key);
        }
        return temp;
    }

    @Override
    public Double getDouble(String key) {
        return getDouble(key , null);
    }

    @Override
    public Double getDouble(String key, Double defaultValue) {
        assertKey(key);
        boolean has = jsonObject.has(key);
        if(!has){
            return checkNullValue(key , defaultValue);
        }
        Double temp;
        if(isTolerant()){
            temp = ValueCompatible.compatibleValue(this.jsonObject.get(key) , Double.class);
        }else {
            temp = this.jsonObject.getDouble(key);
        }
        return temp;
    }

    @Override
    public BigInteger getBigInteger(String key) {
        return getBigInteger(key , null);
    }

    @Override
    public BigInteger getBigInteger(String key, BigInteger defaultValue) {
        assertKey(key);
        boolean has = jsonObject.has(key);
        if(!has){
            return checkNullValue(key , defaultValue);
        }
        BigInteger temp;
        if(isTolerant()){
            temp = ValueCompatible.compatibleValue(this.jsonObject.get(key) , BigInteger.class);
        }else {
            temp = this.jsonObject.getBigInteger(key);
        }
        return temp;
    }

    @Override
    public BigDecimal getBigDecimal(String key) {
        return getBigDecimal(key , null);
    }

    @Override
    public BigDecimal getBigDecimal(String key, BigDecimal defaultValue) {
        assertKey(key);
        boolean has = jsonObject.has(key);
        if(!has){
            return checkNullValue(key , defaultValue);
        }
        BigDecimal temp;
        if(isTolerant()){
            temp = ValueCompatible.compatibleValue(this.jsonObject.get(key) , BigDecimal.class);
        }else {
            temp = this.jsonObject.getBigDecimal(key);
        }
        return temp;
    }

    @Override
    public <T> T get(String key, Class<T> clazz) {
        assertKey(key);
        boolean has = jsonObject.has(key);
        if(!has){
            return checkNullValue(key , null);
        }
        T temp = ValueCompatible.compatibleValue(this.jsonObject.get(key) , clazz);
        return checkNullValue(key, temp);
    }

    @Override
    public Set<String> keySet() {
        return jsonObject.keySet();
    }

    @Override
    public int size() {
        return jsonObject.length();
    }

    @Override
    public boolean isEmpty() {
        return jsonObject.length() == 0;
    }

    @Override
    public boolean containsKey(String key) {
        return jsonObject.has(key);
    }


    @Override
    public JsonObject put(String key, Object value) {
        jsonObject.put(key, value);
        return this;
    }

    @Override
    public JsonObject putAll(Map<? extends String, ?> m) {
        m.forEach(jsonObject::put);
        return this;
    }

    @Override
    public void clear() {
        Set<String> keySet = jsonObject.keySet();
        for (Object key : keySet.toArray()) {
            jsonObject.remove(key.toString());
        }
    }

    @Override
    public Object remove(String key) {
        return jsonObject.remove(key);
    }

    @Override
    public JsonObject parse(String jsonString) {
        jsonObject = new org.json.JSONObject(jsonString);
        return this;
        //return new JSONObject(jsonString);
    }

    @Override
    public JsonObject fromMap(Map<String, Object> map) {
        this.jsonObject = new org.json.JSONObject(map);
        return new JSONObject(map);
    }

    @Override
    public String serialize(Object javaBean) {
        throw new JsonException(new UnsupportedOperationException());
    }

    @Override
    public <T> T deserialize(String jsonString, Class<T> clazz) {
        throw new JsonException(new UnsupportedOperationException());
    }

    @Override
    public String toString() {
        //需要针对JsonObject/JsonArray处理
        Map<String , Json> map = new HashMap<>();
        for (String key : jsonObject.keySet()) {
            Object o = jsonObject.get(key);
            if(o instanceof JsonObject || o instanceof JsonArray){
                map.put(key , (Json) o);
            }
        }
        map.forEach((k , v)-> jsonObject.put(k , v.unwrap()));

        return jsonObject.toString();
    }

    @Override
    public int hashCode() {
        return jsonObject.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        return jsonObject.equals(obj);
    }

}
package cn.zytx.common.json.impl;

import cn.zytx.common.json.Json;
import cn.zytx.common.json.JsonArray;
import cn.zytx.common.json.JsonObject;
import jdk.nashorn.internal.runtime.regexp.joni.constants.OPCode;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.*;

/**
 * @author xiongshiyan at 2018/6/11
 */
public class JSONArray extends BaseJson<JSONArray> implements JsonArray {
    private org.json.JSONArray jsonArray;

    public JSONArray(org.json.JSONArray jsonArray){
        this.jsonArray = jsonArray;
    }
    public JSONArray(List<Object> list){
        this.jsonArray = new org.json.JSONArray(list);
    }
    public JSONArray(){
        this.jsonArray = new org.json.JSONArray();
    }
    public JSONArray(String arrayString){
        this.jsonArray = new org.json.JSONArray(arrayString);
    }

    @Override
    public org.json.JSONArray unwrap() {
        return jsonArray;
    }

    @Override
    public JsonArray parse(String arrayString) {
        jsonArray = new org.json.JSONArray(arrayString);
        return this;
        //return new JSONArray(arrayString);
    }

    @Override
    public int size() {
        return jsonArray.length();
    }

    @Override
    public Object get(int index) {
        assertIndex(index , size());
        Object opt = jsonArray.opt(index);
        return checkNullValue(index,opt);
    }

    @Override
    public String getString(int index) {
        assertIndex(index , size());
        String temp;
        if(isTolerant()){
            temp = ValueCompatible.compatibleValue(jsonArray.opt(index), String.class);
        }else {
            temp = jsonArray.getString(index);
        }
        return checkNullValue(index , temp);
    }

    @Override
    public Boolean getBoolean(int index) {
        assertIndex(index , size());
        Boolean temp;
        if(isTolerant()){
            temp = ValueCompatible.compatibleValue(jsonArray.opt(index), Boolean.class);
        }else {
            temp = jsonArray.getBoolean(index);
        }
        return checkNullValue(index , temp);
    }

    @Override
    public Integer getInteger(int index) {
        assertIndex(index , size());
        Integer temp;
        if(isTolerant()){
            temp = ValueCompatible.compatibleValue(jsonArray.opt(index), Integer.class);
        }else {
            temp = jsonArray.getInt(index);
        }
        return checkNullValue(index , temp);
    }

    @Override
    public Long getLong(int index) {
        assertIndex(index , size());
        Long temp;
        if(isTolerant()){
            temp = ValueCompatible.compatibleValue(jsonArray.opt(index), Long.class);
        }else {
            temp = jsonArray.getLong(index);
        }
        return checkNullValue(index , temp);
    }

    @Override
    public Double getDouble(int index) {
        assertIndex(index , size());
        Double temp;
        if(isTolerant()){
            temp = ValueCompatible.compatibleValue(jsonArray.opt(index), Double.class);
        }else {
            temp = jsonArray.getDouble(index);
        }
        return checkNullValue(index , temp);
    }

    @Override
    public Float getFloat(int index) {
        assertIndex(index , size());
        Float temp;
        if(isTolerant()){
            temp = ValueCompatible.compatibleValue(jsonArray.opt(index), Float.class);
        }else {
            temp = jsonArray.getFloat(index);
        }
        return checkNullValue(index , temp);
    }

    @Override
    public BigInteger getBigInteger(int index) {
        assertIndex(index , size());
        BigInteger temp;
        if(isTolerant()){
            temp = ValueCompatible.compatibleValue(jsonArray.opt(index), BigInteger.class);
        }else {
            temp = jsonArray.getBigInteger(index);
        }
        return checkNullValue(index , temp);
    }

    @Override
    public BigDecimal getBigDecimal(int index) {
        assertIndex(index , size());
        BigDecimal temp;
        if(isTolerant()){
            temp = ValueCompatible.compatibleValue(jsonArray.opt(index), BigDecimal.class);
        }else {
            temp = jsonArray.getBigDecimal(index);
        }
        return checkNullValue(index , temp);
    }

    @Override
    public JsonObject getJsonObject(int index) {
        assertIndex(index , size());
        Object opt = jsonArray.opt(index);
        if(opt instanceof org.json.JSONObject){
            return new JSONObject((org.json.JSONObject)opt);
        }
        if(opt instanceof Map){
            return new JSONObject((Map<String, Object>) opt);
        }
        return (JsonObject) opt;
    }

    @Override
    public JsonArray getJsonArray(int index) {
        assertIndex(index , size());
        Object opt = jsonArray.opt(index);
        if(opt instanceof org.json.JSONArray){
            return new JSONArray((org.json.JSONArray)opt);
        }
        if(opt instanceof List){
            return new JSONArray((List<Object>) opt);
        }
        return (JsonArray) opt;
    }

    @Override
    public JsonArray remove(int index) {
        assertIndex(index , size());
        Object remove = jsonArray.remove(index);
        return this;
    }

    @Override
    public JsonArray clear() {
        int length = jsonArray.length();
        for(int i=0; i<length; i++){
            jsonArray.remove(i);
        }
        return this;
    }

    @Override
    public JsonArray put(Object o) {
        jsonArray.put(o);
        return this;
    }

    @Override
    public JsonArray put(int index, Object o) {
        jsonArray.put(index , o);
        return this;
    }

    @Override
    public JsonArray putAll(Collection<?> os) {
        os.forEach(v->jsonArray.put(v));
        return this;
    }

    @Override
    public String toString() {
        //需要针对JsonObject/JsonArray处理
        Map<Integer , Json> map = new HashMap<>();
        int size = size();
        for (int i = 0; i < size; i++) {
            Object o = jsonArray.get(i);
            if(o instanceof JsonObject || o instanceof JsonArray){
                map.put(i , (Json) o);
            }
        }
        map.forEach((k,v)->jsonArray.put(k , v.unwrap()));

        return jsonArray.toString();
    }

    @Override
    public int hashCode() {
        return jsonArray.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        return jsonArray.equals(obj);
    }

    @Override
    public JsonArray fromList(List<Object> list) {
        this.jsonArray = new org.json.JSONArray(list);
        return this;
    }
}

需要一个兼容数据处理的工具类

package cn.zytx.common.json.impl;

import java.math.BigDecimal;
import java.math.BigInteger;

/**
 * @author xiongshiyan at 2018/6/12
 */
public class ValueCompatible {
    /**
     * 将一个值转换为兼容类型的值
     * @param value src
     * @param toClazz 转换的类型
     */
    public static <T> T compatibleValue(Object value , Class<T> toClazz){
        if(value == null){return null;}
        if(toClazz == String.class){
            return (T)value.toString();
        }
        if(toClazz == Integer.class || toClazz == int.class){
            if(value instanceof Number){
                return (T)Integer.valueOf(((Number)value).intValue());
            }else if(value instanceof String){
                return (T)Integer.valueOf((String) value);
            }
        }
        if(toClazz == Long.class || toClazz == long.class){
            if(value instanceof Number){
                return (T)Long.valueOf(((Number)value).longValue());
            }else if(value instanceof String){
                return (T)Long.valueOf((String) value);
            }
        }
        if(toClazz == Double.class || toClazz == Double.class){
            if(value instanceof Number){
                return (T)Double.valueOf(((Number)value).doubleValue());
            }else if(value instanceof String){
                return (T)Double.valueOf((String) value);
            }
        }
        if(toClazz == Float.class || toClazz == float.class){
            if(value instanceof Number){
                return (T)Float.valueOf(((Number)value).floatValue());
            }else if(value instanceof String){
                return (T)Float.valueOf((String) value);
            }
        }
        if(toClazz == BigDecimal.class){
            return (T)new BigDecimal(value.toString());
        }
        if(toClazz == BigInteger.class){
            return (T)new BigInteger(value.toString());
        }
        if(toClazz == Boolean.class || toClazz == boolean.class){
            return (T)Boolean.valueOf(value.toString());
        }
        if(toClazz == Character.class || toClazz == char.class){
            return (T)value;
        }
        if(toClazz == Byte.class || toClazz == byte.class){
            if(value instanceof Number){
                return (T)Byte.valueOf(((Number)value).byteValue());
            }else if(value instanceof String){
                return (T)Byte.valueOf((String) value);
            }
        }
        if(toClazz == Short.class || toClazz == short.class){
            if(value instanceof Number){
                return (T)Short.valueOf(((Number)value).shortValue());
            }else if(value instanceof String){
                return (T)Short.valueOf((String) value);
            }
        }

        /*if(toClazz == java.util.Date.class){
            if(value instanceof String){
                try {
                    return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(value.toString());
                } catch (ParseException e) {
                    e.printStackTrace();
                }
            }else if(value instanceof Number){
                return new Date(((Number) value).longValue());
            }
        }*/

        return (T)value;
    }
}

3.Gson实现、Jackson实现、jsonlib实现

这几个都基于map和list实现,只是对JavaBean的序列化和反序列化使用不同的方式。

package cn.zytx.common.json.impl;

import cn.zytx.common.json.JsonArray;
import cn.zytx.common.json.JsonObject;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 基于Map的JSONObject实现基类
 * @author xiongshiyan at 2018/6/13
 */
public abstract class BaseMapJSONObject extends BaseJson<BaseMapJSONObject> implements JsonObject{

    protected Map<String , Object> map;

    public BaseMapJSONObject(Map<String , Object> map){
        this.map = map;
    }
    public BaseMapJSONObject(){
        this.map = new HashMap<>();
    }
    public BaseMapJSONObject(String jsonString){
        this.map = str2Map(jsonString);
    }

    protected abstract Map<String , Object> str2Map(String jsonString);

    @Override
    public Map<String , Object> unwrap() {
        return map;
    }

    @Override
    public Object get(String key) {
        assertKey(key);
        return checkNullValue(key , map.get(key));
    }

    @Override
    public Object get(String key, Object defaultObject) {
        assertKey(key);
        Object temp = map.get(key);
        return null == temp ? defaultObject : temp;
    }

    @Override
    public JsonObject getJsonObject(String key) {
        assertKey(key);
        //这里不能使用getJSONObject,因为每一种Json实现不一样,给出的JsonObject类型是不一致的。
        //这里就是各种JsonObject不能混用的原因
        Object temp = this.map.get(key);
        Object t = checkNullValue(key, temp);

        if(t instanceof Map){
            return new JSONObject((Map<String, Object>) t);
        }

        return (JsonObject) t;
    }

    @Override
    public JsonArray getJsonArray(String key) {
        assertKey(key);
        //这里不能使用getJSONObject,因为每一种Json实现不一样,给出的JsonObject类型是不一致的。
        //这里就是各种JsonObject不能混用的原因
        Object temp = this.map.get(key);
        Object t = checkNullValue(key, temp);

        if(t instanceof List){
            return new JSONArray((List<Object>)t);
        }
        return (JsonArray) t;
    }

    @Override
    public String getString(String key) {
        return getString(key , null);
    }

    @Override
    public String getString(String key, String defaultValue) {
        assertKey(key);
        boolean has = map.containsKey(key);
        if(!has){
            return checkNullValue(key , defaultValue);
        }
        String temp;
        Object value = this.map.get(key);
        if(isTolerant()){
            temp = ValueCompatible.compatibleValue(value, String.class);
        }else {
            temp = (String)value;
        }
        return temp;
    }

    @Override
    public Boolean getBoolean(String key) {
        return getBoolean(key , null);
    }

    @Override
    public Boolean getBoolean(String key, Boolean defaultValue) {
        assertKey(key);
        boolean has = map.containsKey(key);
        if(!has){
            return checkNullValue(key , defaultValue);
        }
        Boolean temp;
        Object value = this.map.get(key);
        if(isTolerant()){
            temp = ValueCompatible.compatibleValue(value, Boolean.class);
        }else {
            temp = (Boolean)value;
        }
        return temp;
    }

    @Override
    public Integer getInteger(String key) {
        return getInteger(key , null);
    }

    @Override
    public Integer getInteger(String key, Integer defaultValue) {
        assertKey(key);
        boolean has = map.containsKey(key);
        if(!has){
            return checkNullValue(key , defaultValue);
        }
        Integer temp;
        Object value = this.map.get(key);
        if(isTolerant()){
            temp = ValueCompatible.compatibleValue(value, Integer.class);
        }else {
            temp = (Integer)value;
        }
        return temp;
    }

    @Override
    public Long getLong(String key) {
        return getLong(key , null);
    }

    @Override
    public Long getLong(String key, Long defaultValue) {
        assertKey(key);
        boolean has = map.containsKey(key);
        if(!has){
            return checkNullValue(key , defaultValue);
        }
        Long temp;
        Object value = this.map.get(key);
        if(isTolerant()){
            temp = ValueCompatible.compatibleValue(value, Long.class);
        }else {
            temp = (Long)value;
        }
        return temp;
    }

    @Override
    public Float getFloat(String key) {
        return getFloat(key , null);
    }

    @Override
    public Float getFloat(String key, Float defaultValue) {
        assertKey(key);
        boolean has = map.containsKey(key);
        if(!has){
            return checkNullValue(key , defaultValue);
        }
        Float temp;
        Object value = this.map.get(key);
        if(isTolerant()){
            temp = ValueCompatible.compatibleValue(value, Float.class);
        }else {
            temp = (Float)value;
        }
        return temp;
    }

    @Override
    public Double getDouble(String key) {
        return getDouble(key , null);
    }

    @Override
    public Double getDouble(String key, Double defaultValue) {
        assertKey(key);
        boolean has = map.containsKey(key);
        if(!has){
            return checkNullValue(key , defaultValue);
        }
        Double temp;
        Object value = this.map.get(key);
        if(isTolerant()){
            temp = ValueCompatible.compatibleValue(value, Double.class);
        }else {
            temp = (Double)value;
        }
        return temp;
    }

    @Override
    public BigInteger getBigInteger(String key) {
        return getBigInteger(key , null);
    }

    @Override
    public BigInteger getBigInteger(String key, BigInteger defaultValue) {
        assertKey(key);
        boolean has = map.containsKey(key);
        if(!has){
            return checkNullValue(key , defaultValue);
        }
        BigInteger temp;
        Object value = this.map.get(key);
        if(isTolerant()){
            temp = ValueCompatible.compatibleValue(value, BigInteger.class);
        }else {
            temp = (BigInteger)value;
        }
        return temp;
    }

    @Override
    public BigDecimal getBigDecimal(String key) {
        return getBigDecimal(key , null);
    }

    @Override
    public BigDecimal getBigDecimal(String key, BigDecimal defaultValue) {
        assertKey(key);
        boolean has = map.containsKey(key);
        if(!has){
            return checkNullValue(key , defaultValue);
        }
        BigDecimal temp;
        Object value = this.map.get(key);
        if(isTolerant()){
            temp = ValueCompatible.compatibleValue(value, BigDecimal.class);
        }else {
            temp = (BigDecimal)value;
        }
        return temp;
    }

    @Override
    public <T> T get(String key, Class<T> clazz) {
        Object o = map.get(key);
        return (T)o;
    }

    @Override
    public Set<String> keySet() {
        return map.keySet();
    }

    @Override
    public int size() {
        return map.size();
    }

    @Override
    public boolean isEmpty() {
        return map.isEmpty();
    }

    @Override
    public boolean containsKey(String key) {
        return map.containsKey(key);
    }

    @Override
    public boolean containsValue(Object value) {
        return map.containsValue(value);
    }

    @Override
    public JsonObject put(String key, Object value) {
        map.put(key, value);
        return this;
    }

    @Override
    public JsonObject putAll(Map<? extends String, ?> m) {
        map.putAll(m);
        return this;
    }

    @Override
    public void clear() {
        map.clear();
    }

    @Override
    public Object remove(String key) {
        return map.remove(key);
    }

    @Override
    public int hashCode() {
        return map.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        return map.equals(obj);
    }
}
package cn.zytx.common.json.impl;

import cn.zytx.common.json.Json;
import cn.zytx.common.json.JsonArray;
import cn.zytx.common.json.JsonObject;
import com.google.gson.Gson;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.*;

/**
 * 基于List的JSONArray实现基类
 * @author xiongshiyan at 2018/6/11
 */
public abstract class BaseListJSONArray extends BaseJson<BaseListJSONArray> implements JsonArray {
    protected List<Object> list;
    public BaseListJSONArray(List<Object> list){
        this.list = list;
    }
    public BaseListJSONArray(){
        this.list = new LinkedList<>();
    }
    public BaseListJSONArray(String arrayString){
        this.list = str2List(arrayString);
    }

    public abstract List<Object> str2List(String arrayString);

    @Override
    public int size() {
        return list.size();
    }

    @Override
    public Object get(int index) {
        assertIndex(index , size());
        return checkNullValue(index , list.get(index));
    }

    @Override
    public String getString(int index) {
        assertIndex(index , size());
        String temp;
        Object value = list.get(index);
        if(isTolerant()){
            temp = ValueCompatible.compatibleValue(value, String.class);
        }else {
            temp = (String)value;
        }
        return checkNullValue(index , temp);
    }

    @Override
    public Boolean getBoolean(int index) {
        assertIndex(index , size());
        Boolean temp;
        Object value = list.get(index);
        if(isTolerant()){
            temp = ValueCompatible.compatibleValue(value, Boolean.class);
        }else {
            temp = (Boolean)value;
        }
        return checkNullValue(index , temp);
    }

    @Override
    public Integer getInteger(int index) {
        assertIndex(index , size());
        Integer temp;
        Object value = list.get(index);
        if(isTolerant()){
            temp = ValueCompatible.compatibleValue(value, Integer.class);
        }else {
            temp = (Integer)value;
        }
        return checkNullValue(index , temp);
    }

    @Override
    public Long getLong(int index) {
        assertIndex(index , size());
        Long temp;
        Object value = list.get(index);
        if(isTolerant()){
            temp = ValueCompatible.compatibleValue(value, Long.class);
        }else {
            temp = (Long)value;
        }
        return checkNullValue(index , temp);
    }

    @Override
    public Double getDouble(int index) {
        assertIndex(index , size());
        Double temp;
        Object value = list.get(index);
        if(isTolerant()){
            temp = ValueCompatible.compatibleValue(value, Double.class);
        }else {
            temp = (Double)value;
        }
        return checkNullValue(index , temp);
    }

    @Override
    public Float getFloat(int index) {
        assertIndex(index , size());
        Float temp;
        Object value = list.get(index);
        if(isTolerant()){
            temp = ValueCompatible.compatibleValue(value, Float.class);
        }else {
            temp = (Float)value;
        }
        return checkNullValue(index , temp);
    }

    @Override
    public BigInteger getBigInteger(int index) {
        assertIndex(index , size());
        BigInteger temp;
        Object value = list.get(index);
        if(isTolerant()){
            temp = ValueCompatible.compatibleValue(value, BigInteger.class);
        }else {
            temp = (BigInteger)value;
        }
        return checkNullValue(index , temp);
    }

    @Override
    public BigDecimal getBigDecimal(int index) {
        assertIndex(index , size());
        BigDecimal temp;
        Object value = list.get(index);
        if(isTolerant()){
            temp = ValueCompatible.compatibleValue(value, BigDecimal.class);
        }else {
            temp = (BigDecimal)value;
        }
        return checkNullValue(index , temp);
    }

    @Override
    public JsonArray remove(int index) {
        list.remove(index);
        return this;
    }

    @Override
    public JsonArray clear() {
        list.clear();
        return this;
    }

    @Override
    public JsonArray put(Object o) {
        list.add(o);
        return this;
    }

    @Override
    public JsonArray put(int index, Object o) {
        list.remove(index);
        list.add(index , o);
        return this;
    }

    @Override
    public JsonArray putAll(Collection<?> os) {
        list.addAll(os);
        return this;
    }

    @Override
    public JsonArray parse(String jsonString) {
        this.list = new Gson().fromJson(jsonString, List.class);
        return this;
    }

    @Override
    public List<Object> unwrap() {
        return list;
    }

    @Override
    public String toString() {
        //需要针对JsonObject/JsonArray处理
        Map<Integer , Json> map = new HashMap<>();
        int size = size();
        for (int i = 0; i < size; i++) {
            Object o = list.get(i);
            if(o instanceof JsonObject || o instanceof JsonArray){
                map.put(i , (Json) o);
            }
        }
        map.forEach((k,v)->{
            list.remove((int)k);
            list.add(k , v.unwrap());
        });

        return new Gson().toJson(this.list , List.class);
    }

    @Override
    public int hashCode() {
        return list.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        return list.equals(obj);
    }
}

Gson的实现

package cn.zytx.common.json.impl;

import cn.zytx.common.json.Json;
import cn.zytx.common.json.JsonArray;
import cn.zytx.common.json.JsonObject;
import com.google.gson.Gson;

import java.util.HashMap;
import java.util.Map;

/**
 * @author xiongshiyan at 2018/6/10
 */
public class JSONObject extends BaseMapJSONObject {

    public JSONObject(Map<String , Object> map){
        super(map);
    }
    public JSONObject(){
    }
    public JSONObject(String jsonString){
        super(jsonString);
    }

    @Override
    protected Map<String, Object> str2Map(String jsonString) {
        return new Gson().fromJson(jsonString, Map.class);
    }

    @Override
    public JsonObject parse(String jsonString) {
        this.map = new Gson().fromJson(jsonString, Map.class);
        return this;
    }

    @Override
    public String serialize(Object javaBean) {
        return new Gson().toJson(javaBean);
    }

    @Override
    public <T> T deserialize(String jsonString, Class<T> clazz) {
        return new Gson().fromJson(jsonString , clazz);
    }

    @Override
    public String toString() {
        //需要针对JsonObject/JsonArray处理
        Map<String , Json> map = new HashMap<>();
        for (String key : map.keySet()) {
            Object o = map.get(key);
            if(o instanceof JsonObject || o instanceof JsonArray){
                map.put(key , (Json) o);
            }
        }
        map.forEach((k , v)-> this.map.put(k , v.unwrap()));

        return new Gson().toJson(this.map , Map.class);
    }

    @Override
    public JsonObject fromMap(Map<String, Object> map) {
        return new JSONObject(map);
    }
}
package cn.zytx.common.json.impl;

import cn.zytx.common.json.JsonArray;
import cn.zytx.common.json.JsonObject;
import com.google.gson.Gson;

import java.util.*;

/**
 * @author xiongshiyan at 2018/6/11
 */
public class JSONArray extends BaseListJSONArray {
    public JSONArray(List<Object> list){
        super(list);
    }
    public JSONArray(){
    }
    public JSONArray(String arrayString){
        super(arrayString);
    }

    @Override
    public List<Object> str2List(String arrayString) {
        return new Gson().fromJson(arrayString , List.class);
    }

    @Override
    public JsonObject getJsonObject(int index) {
        assertIndex(index , size());
        Object opt = list.get(index);
        if(opt instanceof Map){
            return new JSONObject((Map<String, Object>) opt);
        }
        return (JsonObject) opt;
    }

    @Override
    public JsonArray getJsonArray(int index) {
        assertIndex(index , size());
        Object opt = list.get(index);
        if(opt instanceof List){
            return new JSONArray((List<Object>) opt);
        }
        return (JsonArray) opt;
    }

    @Override
    public JsonArray fromList(List<Object> list) {
        this.list = list;
        return this;
    }
}

Jackson实现

package cn.zytx.common.json.impl;

import cn.zytx.common.json.Json;
import cn.zytx.common.json.JsonArray;
import cn.zytx.common.json.JsonException;
import cn.zytx.common.json.JsonObject;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author xiongshiyan at 2018/6/10
 */
public class JSONObject extends BaseMapJSONObject {

    private static final ObjectMapper objectMapper = new ObjectMapper();

    public JSONObject(Map<String , Object> map){
        super(map);
    }
    public JSONObject(){
        super();
    }
    public JSONObject(String jsonString){
        super(jsonString);
    }

    @Override
    protected Map<String, Object> str2Map(String jsonString) {
        try {
            return objectMapper.readValue(jsonString , Map.class);
        } catch (IOException e) {
            throw new JsonException(e);
        }
    }

    @Override
    public JsonObject getJsonObject(String key) {
        assertKey(key);
        //这里不能使用getJSONObject,因为每一种Json实现不一样,给出的JsonObject类型是不一致的。
        //这里就是各种JsonObject不能混用的原因
        Object temp = this.map.get(key);
        Object t = checkNullValue(key, temp);

        if(t instanceof Map){
            return new JSONObject((Map<String, Object>) t);
        }

        return (JsonObject) t;
    }

    @Override
    public JsonArray getJsonArray(String key) {
        assertKey(key);
        //这里不能使用getJSONObject,因为每一种Json实现不一样,给出的JsonObject类型是不一致的。
        //这里就是各种JsonObject不能混用的原因
        Object temp = this.map.get(key);
        Object t = checkNullValue(key, temp);

        if(t instanceof List){
            return new JSONArray((List<Object>)t);
        }
        return (JsonArray) t;
    }


    @Override
    public JsonObject parse(String jsonString) {
        try {
            Map map = objectMapper.readValue(jsonString, Map.class);
            this.map = map;
            return this;
        } catch (IOException e) {
            throw new JsonException(e);
        }
    }

    @Override
    public String serialize(Object javaBean) {
        try {
            return objectMapper.writeValueAsString(javaBean);
        } catch (JsonProcessingException e) {
            throw new JsonException(e);
        }
    }

    @Override
    public <T> T deserialize(String jsonString, Class<T> clazz) {
        try {
            return objectMapper.readValue(jsonString , clazz);
        } catch (IOException e) {
            throw new JsonException(e);
        }
    }

    @Override
    public String toString() {
        //需要针对JsonObject/JsonArray处理
        Map<String , Json> map = new HashMap<>();
        for (String key : map.keySet()) {
            Object o = map.get(key);
            if(o instanceof JsonObject || o instanceof JsonArray){
                map.put(key , (Json) o);
            }
        }
        map.forEach((k , v)-> this.map.put(k , v.unwrap()));

        try {
            return objectMapper.writeValueAsString(this.map);
        } catch (JsonProcessingException e) {
            throw new JsonException(e);
        }
    }
    @Override
    public JsonObject fromMap(Map<String, Object> map) {
        return new JSONObject(map);
    }
}
package cn.zytx.common.json.impl;

import cn.zytx.common.json.Json;
import cn.zytx.common.json.JsonArray;
import cn.zytx.common.json.JsonException;
import cn.zytx.common.json.JsonObject;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.IOException;
import java.util.*;

/**
 * @author xiongshiyan at 2018/6/11
 */
public class JSONArray extends BaseListJSONArray {
    private static final ObjectMapper objectMapper = new ObjectMapper();
    public JSONArray(List<Object> list){
        super(list);
    }
    public JSONArray(){
        super();
    }
    public JSONArray(String arrayString){
        super(arrayString);
    }

    @Override
    public List<Object> str2List(String arrayString) {
        try {
            return objectMapper.readValue(arrayString , List.class);
        } catch (IOException e) {
            throw new JsonException(e);
        }
    }

    @Override
    public JsonObject getJsonObject(int index) {
        assertIndex(index , size());
        Object opt = list.get(index);
        if(opt instanceof Map){
            return new JSONObject((Map<String, Object>) opt);
        }
        return (JsonObject) opt;
    }

    @Override
    public JsonArray getJsonArray(int index) {
        assertIndex(index , size());
        Object opt = list.get(index);
        if(opt instanceof List){
            return new JSONArray((List<Object>) opt);
        }
        return (JsonArray) opt;
    }

    @Override
    public JsonArray parse(String jsonString) {
        try {
            this.list = objectMapper.readValue(jsonString, List.class);
            return this;
        } catch (IOException e) {
            throw new JsonException(e);
        }
    }

    @Override
    public String toString() {
        //需要针对JsonObject/JsonArray处理
        Map<Integer , Json> map = new HashMap<>();
        int size = size();
        for (int i = 0; i < size; i++) {
            Object o = list.get(i);
            if(o instanceof JsonObject || o instanceof JsonArray){
                map.put(i , (Json) o);
            }
        }
        map.forEach((k,v)->{
            list.remove((int)k);
            list.add(k , v.unwrap());
        });

        try {
            return objectMapper.writeValueAsString(this.list);
        } catch (JsonProcessingException e) {
            throw new JsonException(e);
        }
    }

    @Override
    public JsonArray fromList(List<Object> list) {
        /*String jsonString = objectMapper.writeValueAsString(list);
        this.list = objectMapper.readValue(jsonString, List.class);*/
        this.list = list;
        return this;
    }
}

Jsonlib实现

package cn.zytx.common.json.impl;

import cn.zytx.common.json.Json;
import cn.zytx.common.json.JsonArray;
import cn.zytx.common.json.JsonObject;
import net.sf.ezmorph.bean.MorphDynaBean;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author xiongshiyan at 2018/6/10
 */
public class JSONObject extends BaseMapJSONObject {

    public JSONObject(Map<String , Object> map){
        super(map);
    }
    public JSONObject(){
        super();
    }
    public JSONObject(String jsonString){
        super(jsonString);
    }

    @Override
    protected Map<String, Object> str2Map(String jsonString) {
        Map<String, Object> o = (Map<String, Object>) net.sf.json.JSONObject.toBean(
                net.sf.json.JSONObject.fromObject(jsonString), Map.class);
        Map<String , Object> temp = new HashMap<>();
        o.forEach((k , v)->{
            if(v instanceof MorphDynaBean){
                Field[] declaredFields = MorphDynaBean.class.getDeclaredFields();
                for (Field declaredField : declaredFields) {
                    if("dynaValues".equals(declaredField.getName())){
                        try {
                            declaredField.setAccessible(true);
                            Object o1 = declaredField.get(v);
                            temp.put(k , o1);

                        } catch (IllegalAccessException e) { }
                        break;
                    }
                }
            }
        });
        o.putAll(temp);
        return o;
    }

    @Override
    public JsonObject getJsonObject(String key) {
        assertKey(key);
        //这里不能使用getJSONObject,因为每一种Json实现不一样,给出的JsonObject类型是不一致的。
        //这里就是各种JsonObject不能混用的原因
        Object temp = this.map.get(key);
        Object t = checkNullValue(key, temp);

        if(t instanceof Map){
            return new JSONObject((Map<String, Object>) t);
        }

        return (JsonObject) t;
    }

    @Override
    public JsonArray getJsonArray(String key) {
        assertKey(key);
        //这里不能使用getJSONObject,因为每一种Json实现不一样,给出的JsonObject类型是不一致的。
        //这里就是各种JsonObject不能混用的原因
        Object temp = this.map.get(key);
        Object t = checkNullValue(key, temp);

        if(t instanceof List){
            return new JSONArray((List<Object>)t);
        }
        return (JsonArray) t;
    }


    @Override
    public JsonObject parse(String jsonString) {
        this.map = str2Map(jsonString);
        return this;
    }

    @Override
    public String serialize(Object javaBean) {
        return net.sf.json.JSONObject.fromObject(javaBean).toString();
    }

    @Override
    public <T> T deserialize(String jsonString, Class<T> clazz) {
        return (T)net.sf.json.JSONObject.toBean(net.sf.json.JSONObject.fromObject(jsonString) , clazz);
    }

    @Override
    public String toString() {
        //需要针对JsonObject/JsonArray处理
        Map<String , Json> map = new HashMap<>();
        for (String key : map.keySet()) {
            Object o = map.get(key);
            if(o instanceof JsonObject || o instanceof JsonArray){
                map.put(key , (Json) o);
            }
        }
        map.forEach((k , v)-> this.map.put(k , v.unwrap()));

        return net.sf.json.JSONObject.fromObject(this.map).toString();
    }
}
package cn.zytx.common.json.impl;

import cn.zytx.common.json.Json;
import cn.zytx.common.json.JsonArray;
import cn.zytx.common.json.JsonObject;
import java.util.*;

/**
 * @author xiongshiyan at 2018/6/11
 */
public class JSONArray extends BaseListJSONArray {
    public JSONArray(List<Object> list){
        super(list);
    }
    public JSONArray(){
        super();
    }
    public JSONArray(String arrayString){
        super(arrayString);
    }

    @Override
    public List<Object> str2List(String arrayString) {
        return net.sf.json.JSONArray.toList(net.sf.json.JSONArray.fromObject(arrayString));
    }

    @Override
    public JsonObject getJsonObject(int index) {
        assertIndex(index , size());
        Object opt = list.get(index);
        if(opt instanceof Map){
            return new JSONObject((Map<String, Object>) opt);
        }
        return (JsonObject) opt;
    }

    @Override
    public JsonArray getJsonArray(int index) {
        assertIndex(index , size());
        Object opt = list.get(index);
        if(opt instanceof List){
            return new JSONArray((List<Object>) opt);
        }
        return (JsonArray) opt;
    }

    @Override
    public JsonArray parse(String jsonString) {
        this.list = str2List(jsonString);
        return this;
    }

    @Override
    public String toString() {
        //需要针对JsonObject/JsonArray处理
        Map<Integer , Json> map = new HashMap<>();
        int size = size();
        for (int i = 0; i < size; i++) {
            Object o = list.get(i);
            if(o instanceof JsonObject || o instanceof JsonArray){
                map.put(i , (Json) o);
            }
        }
        map.forEach((k,v)->{
            list.remove((int)k);
            list.add(k , v.unwrap());
        });

        return net.sf.json.JSONArray.fromObject(this.list).toString();
    }
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
1.1 快速搭建IOS及安卓App服务器 1.2 基础知识 2 通用解析程序源码 源文件webeasy/WEB-INF/classes/JSONEasy.java package htok.apps; import htok.Path; import htok.tools.*; import htok.we.html.*; import htok.we.*; import javax.servlet.http.*; import java.util.*; import com.alibaba.fastjson.*; public class JSONEasy extends JspEasy { /*/构造对象 public JSONEasy() { super(); }*/ public JSONEasy(HttpServletRequest request,HttpServletResponse response) { super(request,response); } //解析JSON文本 public void parseJson(String json) {parseJson(json,"j");} public void parseJson(String json,String prefix) { int pos = json.indexOf("["); if(pos==-1) { try { JSONObject jsonObj = JSON.parseObject(json); json2Bag(jsonObj,prefix,0); } catch (Exception e) { getBag("pPage").set("jsonerror", "Invalid JSON format");log(e.getMessage()); } } else if(pos==0) { try { JSONArray jsonArr = JSON.parseArray(json); jsonArray2Bag(jsonArr,prefix,0); } catch (Exception e) { getBag("pPage").set("jsonerror", "Invalid JSON format"); } } else{ String str = json.substring(0,pos); str = str.trim(); if(str.equals("")) { try { JSONArray jsonArr = JSON.parseArray(json); jsonArray2Bag(jsonArr,prefix,0); } catch (Exception e) { getBag("pPage").set("jsonerror", "Invalid JSON format"); } } else{ try { JSONObject jsonObj = JSON.parseObject(json); json2Bag(jsonObj,prefix,0); } catch (Exception e) { getBag("pPage").set("jsonerror", "Invalid JSON format"); } } } } public void json2Bag(JSONObject jsonObj,String prefix,int level) { try { String key; String value; Bag b0 = new Bag(Bag.BAG); String prefix1; if(prefix.indexOf("0")>0) prefix1 = new StringBuffer(prefix).append(".").append(String.valueOf(level)).toString(); else prefix1 = new StringBuffer(prefix).append(String.valueOf(level)).toString(); setBag(prefix1,b0);//log(prefix1); int i=0; for (Map.Entry<String, Object> entry : jsonObj.entrySet()) { key = entry.getKey(); if(!tools.canName(key)) key = new StringBuffer("_").append(key).toString(); Object ob = entry.getValue(); if(ob instanceof JSONArray)//如果下级是json数组就调jsonArray2Bag { jsonArray2Bag((JSONArray)ob,prefix1,i); b0.set(key,new StringBuffer(prefix1).append(".").append(String.valueOf(i)).toString()); } else if(ob instanceof JSONObject)//如果下级是json对象就递归 { json2Bag((JSONObject)ob,prefix1,i); b0.set(key,new StringBuffer(prefix1).append(".").append(String.valueOf(i)).toString()); } else{//如果下级是如果是文本或值,就放进书包 value = String.valueOf(ob); if (!value.equals("")) b0.set(key, value); } i++; } } catch (Exception e) { getBag("pPage").set("jsonerror", "Invalid JSON format"); } } public void jsonArray2Bag(JSONArray jsonArray,String prefix,int level) { try { Bag b0 = new Bag(Bag.BAG); String prefix1; if(prefix.indexOf("0")>0) prefix1 = new StringBuffer(prefix).append(".").append(String.valueOf(level)).toString(); else prefix1 = new StringBuffer(prefix).append(String.valueOf(level)).toString(); setBag(prefix1,b0);//log(prefix1); int i=0; for(Object ob :jsonArray) { b0.setSuffix(i); if(ob instanceof JSONArray)//如果下级是json数组就递归 { jsonArray2Bag((JSONArray)ob,prefix1,i); b0.set("v",new StringBuffer(prefix1).append(".").append(String.valueOf(i)).toString()); } else if(ob instanceof JSONObject)//如果下级是json对象就生成一个以对象名为id的书包 { int j=0; for (Map.Entry<String, Object> entry : ((JSONObject)ob).entrySet()) { String key = entry.getKey(); if(!tools.canName(key)) key = new StringBuffer("_").append(key).toString(); Object ob1 = entry.getValue(); if(ob1 instanceof JSONArray)//如果下级是json数组就调jsonArray2Bag { jsonArray2Bag((JSONArray)ob1,new StringBuffer(prefix1).append(".").append(String.valueOf(i)).toString(),j); b0.set(key,new StringBuffer(prefix1).append(".").append(String.valueOf(i)).append(".").append(String.valueOf(j)).toString()); } else if(ob1 instanceof JSONObject)//如果下级是json对象就递归 { json2Bag((JSONObject)ob1,new StringBuffer(prefix1).append(".").append(String.valueOf(i)).toString(),j); b0.set(key,new StringBuffer(prefix1).append(".").append(String.valueOf(i)).append(".").append(String.valueOf(j)).toString()); } else{//如果下级是如果是文本或值,就放进书包 String value = String.valueOf(ob1); if (!value.equals("")) b0.set(key, value); } j++; } b0.set("v",new StringBuffer(prefix1).append(".").append(String.valueOf(i)).toString()); } else{//如果下级是如果是文本或值,就放进书包 String value = String.valueOf(ob); if (!value.equals("")) b0.set("v", value); } i++; } } catch (Exception e) { getBag("pPage").set("jsonerror", "Invalid JSON format"); } } public void log(String str) { Path.log("JSONEasy_",str); } } 3 用法 构造:JSONEasy je = new JSONEasy(request,response); 解析:je.parseJson(“{\“name\”,\”value\”}”); 3.1 结果处理 引入结果处理文件:je.show("@{sys:curPath}json2bag.html"); 根书包名默认为:j0 根书包中直接按key取值,如:@{j0:name},得到value 下一级节点则从上一级节点书包中先取回书包名: <bag id=pPage><!-- 取出书包名,根书包名默认为j0 --> <we name=array>@{j0:array}</we> </bag> 再下级节点以此类推 然后按当前节点中的key直接取值即可:@{@{pPage:array}:c1} 4 实例 解析并在网页中显示下面的json文本 文本内容 {"test":"测试的文本","array":[{"c1":"值1","c2":"值2"},{"c1":"值1","c2":"值2"},{"c1":"值1","c2":"值2"}]} 文本文件:webeasy/_samples/jspeasy/json/json2bag.json 4.1 读文本文件: <chtml> <file act=read enc=GBK method=str name=json>@{sys:curPath}json2bag.json</file> </chtml> 例子文件:webeasy/_samples/jspeasy/json/json2bag.htm 4.2 解析文本 <%@ page session="true" import="htok.apps.*,htok.we.html.*,htok.tools.*,htok.we.*,java.net.*"%> <% JSONEasy je = new JSONEasy(request,response); je.work("@{sys:curPath}json2bag.htm");//引入读文本的文件 je.parseJson(je.equ("@{file:json}"));//解析json文本,把结果放到书包中 je.show("@{sys:curPath}json2bag.html");//输出书包中的内容 %> 例子文件:webeasy/_samples/jspeasy/json/json2bag.jsp 4.3 输出书包中的内容 <!DOCTYPE html> <html> <h1>测试:@{j0:test}</h1> <chtml> <bag id=pPage><!-- 取出书包名,根书包名默认为j0 --> <we name=array>@{j0:array}</we> </bag> <for bags="@{pPage:array}" end="@{@{pPage:array}:getLength}"> <p> <b>第@{int:@{@{pPage:array}:getSuffix}+1}行</b><br> <span>列1:@{@{pPage:array}:c1},列2:@{@{pPage:array}:c2}</span> </p> </for> </chtml> </html> 例子文件:webeasy/_samples/jspeasy/json/json2bag.html 4.4 效果

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值