有时串的反序列化,有时用Gson反对

时间:2013-10-20 13:45:53

标签: java json gson

我需要将这种类型的JSON数据解析为java对象:

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

我正在使用Gson,并且不知道如何解决这个特殊问题,“blob”有时候是一个字符串,有时候是一个对象。

3 个答案:

答案 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()在运行时确定类型。

Documentation

        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
            }