【问题标题】:What techniques do you use to handle different JSON structure?您使用什么技术来处理不同的 JSON 结构?
【发布时间】:2017-02-08 04:33:08
【问题描述】:

改装电话:

@GET("getUser")
    Call<Map<Object,Object>> getUser(@Query("phoneNumber") String phoneNumber, @Query("hash") String hash)

如果返回用户对象,我需要从浏览器返回 json:

{"error":"0","value":[{"id":1,"name":"","phoneNumber":"87472335578","smsCode":497797,"smsCodeDate":1475160867,"hash":"76dcc911e14f997189243f3370080e62","roles":[{"id":2,"name":"ROLE_USER"}]}]}

如果返回错误,则从浏览器返回json:

{"error":"-1"}

android 中的回调响应

对于这个问题 我使用Map&lt;Object,Object&gt; 来处理不同的 JSON 结构。但问题在于数字的转换。我需要 int 或 long 而 java 将其视为 double 值。我可以使用一些解析方法。但如果 Map 中有很多变量,那将是一件很糟糕的工作。

我不能使用Map&lt;String,String&gt;然后解析它,因为Gson不想处理它。有反斜杠。当然,删除它们是显而易见的,但我想找到优雅的方式来处理 JSON。

服务器端json生成器代码

public final static String SUCCESS = "0";
public final static String NOT_FOUND = "-1";

Map<Object, Object> m = new HashMap<>();

@RequestMapping("/getUser")
    Map<Object, Object> getUser(@RequestParam(value = "phoneNumber", defaultValue = "") String phoneNumber,
            @RequestParam(value = "hash", defaultValue = "") String hash) {

        m.clear();

        User user = userRepository.findByPhoneNumberAndHash(phoneNumber, hash);
        if (user != null) {
            m.put(ERROR_JSON, SUCCESS);
            m.put(VALUE_JSON, String.valueOf(user));
        } else {
            m.put(ERROR_JSON, NOT_FOUND);
        }
        return m;
    }

上面的方法返回这个json:

{"error":"0","value":[{\"id\":\"1\",\"name\":\"\",\"phoneNumber\":\"87472335578\",\"smsCode\":497797,\"smsCodeDate\":1475160867,\"hash\":\"76dcc911e14f997189243f3370080e62\",\"roles\":[{\"id":2,\"name\":\"ROLE_USER\"}]}]}

original post

【问题讨论】:

标签: json object type-conversion retrofit2 android gson


【解决方案1】:

关注 http://wiki.workassis.com/android-retrofit-2-1-http-client/ 这个教程并使用以下作为你的模型类

class Result{
    String error;
    List<Value> value;
}

class Value{
    int id;
    String name;
    String phoneNumber;
    String smsCode;
    Long smsCodeDate;
    String hash;
    List<Roles> roles;

}

class Roles{
    int id;
    String name;
}

并使用

@GET("getUser")
Call<Result>getUser(@Query("phoneNumber") String phoneNumber, @Query("hash") String hash)

【讨论】:

  • 我是在客户端做的,但从这里离开了。我使用未键入 List 代替。有了这个答案,我想到了在服务器端使用同样的方法。这很明显))但这个想法只是现在才出现。谢谢@Bikesh M Annur 先生
猜你喜欢
  • 1970-01-01
  • 2010-10-13
  • 2013-02-04
  • 2010-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多