如何转换json串到java对象Object

如何转换json字符串到java对象Object

例如输入是string,如何是json串那么翻译json串,如果不是则直接返回原始串:

Object toJavaObject(String jsonString)

函数原型如上定义,如果输入串不是json串,则直接返回原始串,String对象也是一个Object对象。

具体代码如下:

import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.json.Json;
import javax.json.JsonArray;
import javax.json.JsonException;
import javax.json.JsonNumber;
import javax.json.JsonObject;
import javax.json.JsonReader;
import javax.json.JsonString;
import javax.json.JsonStructure;
import javax.json.JsonValue;
import javax.json.JsonWriter;
import javax.json.stream.JsonParsingException;

public class TestMain {

    public static void main(String[] args) {
        TestMain main = new TestMain();
        main.run();
    }
    
    public void run() {
        String jsonString;
        jsonString = "{\"name\":\"aaa\", \"age\":17}";
        jsonString = "[\"aaa\", true, 12, 12.0]";
        jsonString = "true";

        Object obj = toJavaObject(jsonString);
        System.out.printf("[%s]\n", obj);
    }
    
    // String to java Object
    public Object toJavaObject(String jsonString)  {
        Object obj = jsonString;
        JsonReader reader = Json.createReader(new StringReader(jsonString));;
        try {
            JsonObject jsonObject = reader.readObject();
            obj = toJavaMap(jsonObject);
        } catch (JsonParsingException e) {
            System.out.println("not an object");
            JsonReader reader2 = Json.createReader(new StringReader(jsonString));
            try {
                JsonArray jsonArray = reader2.readArray();
                obj = toJavaList(jsonArray);
            } catch (JsonParsingException e2) {
                System.out.println("not an array");
            } finally {
                reader2.close();
            }
        } finally {
            reader.close();
        }
        return obj;
    }
    
    /**
     * Convert a javax.json.JsonValue to java Object
     * 
     * @param jsonValue
     * @return
     */
    public static Object toJavaObject(JsonValue jsonValue) {
          switch (jsonValue.getValueType()) {
            case NULL:
                return null;
            case FALSE:
                return Boolean.FALSE;
            case TRUE:
                return Boolean.TRUE;
            case NUMBER:
                JsonNumber jsonNumber = (JsonNumber) jsonValue;
                if (jsonNumber.isIntegral()) {
                    return jsonNumber.intValue();
                } else {
                    return jsonNumber.doubleValue();
                }
            case STRING:
                JsonString jsonString = (JsonString) jsonValue;
                return jsonString.getString();
            case ARRAY:
                return toJavaList((JsonArray) jsonValue);
            case OBJECT:
                return toJavaMap((JsonObject) jsonValue);
            default:
                throw new JsonException("Json value with unknown type: " + jsonValue);
          }
    }
    
    public static List<Object> toJavaList(JsonArray array) {
        List<Object> list = new ArrayList<Object>();

        @SuppressWarnings("rawtypes")
        Iterator it = array.iterator();
        while (it.hasNext()) {
            Object value = it.next();
            if(value instanceof JsonArray) {
                value = toJavaList((JsonArray) value);
            }
            else if(value instanceof JsonObject) {
                value = toJavaMap((JsonObject) value);
            } else {
                value = toJavaObject((JsonValue)value);
            }
            list.add(value);
        }
        return list;
    }
    
    
    public static Map<String, Object> toJavaMap(JsonObject object)  {
        Map<String, Object> map = new HashMap<String, Object>();

        for (Object o : object.entrySet()) {
            @SuppressWarnings("rawtypes")
            Map.Entry e = (Map.Entry) o;
            String key = (String) e.getKey();
            Object value = e.getValue();
            if(value instanceof JsonArray) {
                value = toJavaList((JsonArray) value);
            }
            else if(value instanceof JsonObject) {
                value = toJavaMap((JsonObject) value);
            } else {
                value = toJavaObject((JsonValue)value);
            }
            map.put(key, value);
        }
        return map;
    }
}

这个例子中,我们使用了javax.json.Json包的内容完成json字符串的解析,然后遍历JsonObject/JsonArray对象,对每一个域映射到java对象Object.

另外如果借助于Jackson或者Gson等第三方库可以更加非常方便的进行在json串,json对象,和java对象之间互相转换。

另外前面代码中有一个地方需要注意:

            case NUMBER:
                JsonNumber jsonNumber = (JsonNumber) jsonValue;
                if (jsonNumber.isIntegral()) {
                    return jsonNumber.intValue();
                } else {
                    return jsonNumber.doubleValue();
                }

这个地方必须这样写,如果写出下面格式:

            case NUMBER:
                JsonNumber jsonNumber = (JsonNumber) jsonValue;
                return jsonNumber.isIntegral() ? jsonNumber.intValue() : jsonNumber.doubleValue();

是不行的,它只会返回double类型的值。究其原因请参考java三元表达式当两边的操作数类型不一致时,如何做类型提升的问题。在此例中,int值被提升到了double。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、Java 简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计...
    子非鱼_t_阅读 9,813评论 1 44
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,958评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,534评论 19 139
  • 凡事不要冲动 遇事多加思考 每一天都很美好 每天在期待中醒来在圆满中睡去 喜欢的不要太过执着 错过的也是一种回味 ...
    帅气迷人的古叔叔阅读 2,629评论 0 1
  • hadoop序列化和反序列化 1 什么是序列化和反序列化 序列化就是将内存中的对象或数据,转换成字节数组,以便于存...
    yanzhelee阅读 7,024评论 0 1