如何转换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 toJavaList(JsonArray array) {
        List list = new ArrayList();

        @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 toJavaMap(JsonObject object)  {
        Map map = new HashMap();

        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。

你可能感兴趣的:(如何转换json串到java对象Object)