繁体   English   中英

如何使用gson处理动态响应数据? (JSON转换为Java对象)

[英]how to use gson handle dynamic response data? (json to java object)

这是Json用户列表:

{
    'response': {
        'result': {
            'users': [{
                name: "ABC",
                age: "20",
                gender: "F"
            },
            {
                name: "cbd",
                age: "23",
                gender: "M"
            }]
        }
    }
}

有时这样返回

{
    'response': {
        'result': {
            'users': {
                name: "ABC",
                age: "20",
                gender: "F"
            }
        }
    }
}

当它返回单个用户时,我可以使用以下Java类将json转换为Java

class Data{
    private response response;
    class response{
        private result result;
        class result{
            private users users;
            class users{
                private String name;
                private String age;
                private String gender;

            }

        }
    }

}

但是,如果返回用户列表,则会出现异常。 我该如何处理?

若要执行所需的操作,必须将users更改为List<User> 编写一个(简单的)自定义反序列化器。 没有自定义反序列化器,Gson将不会解析,除非您将用户切换到Object (但在这种情况下,它将返回地图列表)。

在向您展示可以在IDE中复制并运行的完整示例之前,请注意两个注意事项。 用用户“”代替“”作为字符串定界符,并遵循Java命名约定 。类必须至少使用大写字母。小写字母不会改变Gson的行为,因为它会查看类字段名称而不是类名称。

package stackoverflow.questions.q19124387;

import java.lang.reflect.Type;
import java.util.*;



import com.google.gson.*;
import com.google.gson.reflect.TypeToken;

public class Q19124387 {

   public static class User {
      private String name;
      private String age;
      private String gender;
      @Override
      public String toString() {
         return "User [name=" + name + ", age=" + age + ", gender=" + gender + "]";
      }



   }

   public static class Result {
      private List<User> users = new ArrayList<User>();

   }

   public static class Response {
      private Result result;

   }

   public static class Data {
      private Response response;

   }

   public static class CustomDeserializer implements JsonDeserializer<Result> {

      public Result deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {

         Result r = null;

         JsonElement usersField = json.getAsJsonObject().get("users");
         if (usersField.isJsonNull() || usersField.isJsonPrimitive())
            ; // if is null or is a primitive type will return an empty result
         else if (usersField.isJsonObject()) {
            r = new Result();
            r.users.add((User) context.deserialize(usersField, User.class));

         } else if (usersField.isJsonArray()) {
            Type listOfUserType = new TypeToken<List<User>>() {}.getType();
            r = new Result();

            r.users.addAll((Collection<? extends User>) context.deserialize(usersField, listOfUserType));

         }
         return r;

      }

   }

   /**
    * @param args
    */
   public static void main(String[] args) {
      String json1 = " {\"response\": {  \"result\": { \"users\": [{ name: \"ABC\",  age: \"20\", gender: \"F\"  },  { name: \"cbd\",  age: \"23\", gender: \"M\"  }] }  }  }";

      String json2 = "{\"response\": { \"result\": {\"users\": { name: \"ABC\", age: \"20\",gender: \"F\" } } } }  ";

      Gson g = new Gson();
      try {
         Data d1 = g.fromJson(json1, Data.class);
         System.out.println("Parsed json1, list of users");
      } catch (Exception e) {
         System.out.println("Cannot parse json1, list of users");
      }
      try {
         Data d2 = g.fromJson(json2, Data.class);
         System.out.println("Parsed json2, single user");
      } catch (Exception e) {
         System.out.println("Cannot parse json2, single user");
      }

      GsonBuilder gb = new GsonBuilder();
      gb.registerTypeAdapter(Result.class, new CustomDeserializer());
      Gson g2 = gb.create();

      Data d1 = g2.fromJson(json1, Data.class);
      Data d2 = g2.fromJson(json2, Data.class);

      System.out.println("Second user of json1 is " + d1.response.result.users.get(1));
      System.out.println("First user of json2 is " + d2.response.result.users.get(0));

   }

}

这是代码的执行:

Parsed json1, list of user
Cannot parse json2, single user
Second user of json1 is User [name=cbd, age=23, gender=M]
First user of json2 is User [name=ABC, age=20, gender=F]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM