Java 用Gson反序列化有时字符串有时对象

Java 用Gson反序列化有时字符串有时对象,java,json,gson,Java,Json,Gson,我需要将这种类型的JSON数据解析为java对象: {"id": 1, "blob": "example text"} {"id": 2, "blob": {"to": 1234, "from": 4321, "name": "My_Name"}} 我正在使用Gson,不知道如何解决这个特殊的问题,“blob”有时是字符串,有时是对象 试试这个 你的POJO class FromToName{ String to; String from; String name;

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

{"id": 1, "blob": "example text"} 
{"id": 2, "blob": {"to": 1234, "from": 4321, "name": "My_Name"}}
我正在使用Gson,不知道如何解决这个特殊的问题,“blob”有时是字符串,有时是对象

试试这个

你的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);
   }

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

将其作为JSON元素,然后在运行时使用isMethods()确定类型


解决问题的一个方法是为类编写一个
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)访问其元素


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

Yech!你现在能更改/修复格式吗?不太确定你在问什么。您的意思是,如果我可以手动更改JSON的布局,您需要blob吗?:“示例文本值?是的,我需要这样我既可以有blob是字符串的情况,也可以有blob是对象的情况。@user1090614如果“需要”真的是“想要”-也就是说,这不是一个愚蠢的外部API或接口不能更改的要求-那么最好的解决方案是修复结构,使其统一或类型按键分开。我写道,blob将反序列化为
LinkedTreeMap
,因此您可以使用
((Map)test2.blob)访问其元素。get(“to”)
例如。可能是因为我忘记了代码格式,所以没有突出显示。现在已经修好了。
Test 1: Test [id=1, blob=example text]
Test 2: Test [id=2, blob={to=1234.0, from=4321.0, name=My_Name}]