4

I need to parse this type of JSON data to java objects:

{"id": 1, "blob": "example text"} 
{"id": 2, "blob": {"to": 1234, "from": 4321, "name": "My_Name"}}

I am using Gson, and don't know how to get around this particular problem, of "blob" sometimes being a string and sometimes an object.

4

3 回答 3

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")例如访问其元素;

让我知道这是否足够,或者您是否也对类型适配器解决方案感兴趣。

于 2013-10-20T19:41:11.673 回答
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);
   }

如果您对此有任何疑问,请告诉我

于 2013-10-20T14:47:54.403 回答
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
            }
于 2013-10-20T19:40:28.503 回答