json列をjavaオブジェクトObjectに変換する方法

5686 ワード

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]
", 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オブジェクト間での相互変換がより容易になります.
また、前のコードの1つに注意してください.
            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に引き上げられます.