我需要将这种类型的JSON数据解析为java对象:
{"id": 1, "blob": "example text"}
{"id": 2, "blob": {"to": 1234, "from": 4321, "name": "My_Name"}}
我正在使用Gson,并且不知道如何解决这个特殊问题,“blob”有时候是一个字符串,有时候是一个对象。
答案 0 :(得分:4)
您的问题的一个解决方案是为您的班级写一个TypeAdapter
,但是如果您的示例中只有 个案例,那么您可以达到相同的结果让Gson执行此操作你可以使用最通用的类进行反序列化。
我的意思如下面的代码所示。
package stackoverflow.questions.q19478087;
import com.google.gson.Gson;
public class Q19478087 {
public class Test {
public int id;
public Object blob;
@Override
public String toString() {
return "Test [id=" + id + ", blob=" + blob + "]";
}
}
public static void main(String[] str){
String json1 = "{\"id\": 1, \"blob\": \"example text\"}";
String json2 = "{\"id\": 2, \"blob\": {\"to\": 1234, \"from\": 4321, \"name\": \"My_Name\"}}";
Gson g = new Gson();
Test test1 = g.fromJson(json1, Test.class);
System.out.println("Test 1: "+ test1);
Test test2 = g.fromJson(json2, Test.class);
System.out.println("Test 2: "+ test2);
}
}
这是我的执行:
Test 1: Test [id=1, blob=example text]
Test 2: Test [id=2, blob={to=1234.0, from=4321.0, name=My_Name}]
在第二种情况下,blob将被反序列化为LinkedTreeMap,因此您可以使用((Map) test2.blob).get("to")
来访问其元素;
让我知道它是否足够,或者您是否对类型适配器解决方案感兴趣。
答案 1 :(得分:0)
试试这个
你的POJO
class FromToName{
String to;
String from;
String name;
@Override
public String toString() {
return "FromToName [to=" + to + ", from=" + from + ", name=" + name
+ "]";
}
}
您的转换代码
String json ="{\"id\": 1, \"blob\": \"example text\"}";
//String json = "{\"id\": 2, \"blob\": {\"to\": 1234, \"from\": 4321, \"name\": \"My_Name\"}}";
Gson gson = new Gson();
JsonElement element = gson.fromJson (json, JsonElement.class);
JsonObject jsonObj = element.getAsJsonObject();
JsonElement id = jsonObj.get("id");
System.out.println(id);
if(jsonObj.get("blob") instanceof JsonPrimitive ){
JsonElement blob = jsonObj.get("blob");
System.out.println(blob);
}else{
FromToName blob = gson.fromJson (jsonObj.get("blob"), FromToName.class);
System.out.println(blob);
}
如果您对此有任何疑问,请告诉我
答案 2 :(得分:0)
将其作为JSON元素,然后使用isMethods()在运行时确定类型。
JsonParser jp = new JsonParser();
JsonElement ele = jp.parse(jsonString).getAsJsonObject().get("blob");;
if (ele.isJsonObject()) {
//do related stuff here
} else if (ele.isJsonArray()) {
//do related stuff here
}