如何轉(zhuǎn)換json字符串到j(luò)ava對象Object
例如輸入是string橘蜜,如何是json串那么翻譯json串含鳞,如果不是則直接返回原始串:
Object toJavaObject(String jsonString)
函數(shù)原型如上定義城丧,如果輸入串不是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包的內(nèi)容完成json字符串的解析,然后遍歷JsonObject/JsonArray對象磺平,對每一個域映射到j(luò)ava對象Object.
另外如果借助于Jackson或者Gson等第三方庫可以更加非常方便的進行在json串魂仍,json對象,和java對象之間互相轉(zhuǎn)換拣挪。
另外前面代碼中有一個地方需要注意:
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三元表達式當兩邊的操作數(shù)類型不一致時赊舶,如何做類型提升的問題。在此例中赶诊,int值被提升到了double笼平。