json列をjavaオブジェクトObjectに変換する方法
5686 ワード
json文字列をjavaオブジェクトObjectに変換する方法
たとえば、入力がstringで、どのようにjson列であるかは、json列を翻訳し、そうでない場合は元の列を直接返します.
関数プロトタイプは上記のように定義されており、入力列がjson列でない場合は元の列に戻り、StringオブジェクトもObjectオブジェクトです.
具体的なコードは以下の通りです.
この例ではjavaxを使用します.json.Jsonパッケージの内容はjson文字列の解析を完了し、JsonObject/JsonArrayオブジェクトを巡回し、各ドメインに対してjavaオブジェクトObjectにマッピングする.
また、JacksonやGsonなどのサードパーティ製ライブラリを使用すると、json列、jsonオブジェクト、javaオブジェクト間での相互変換がより容易になります.
また、前のコードの1つに注意してください.
ここはこのように書かなければなりません.次のフォーマットを書けばいいです.
いいえ、doubleタイプの値しか返されません.その原因を究明するにはjava三元式を参照してください.両側の操作数のタイプが一致しない場合、どのようにタイプを上げるかの問題です.この例では、int値はdoubleに引き上げられます.
たとえば、入力が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
この例では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に引き上げられます.