简体   繁体   English

Android Jackson库解析

[英]Android Jackson Library parsing

I am getting a "JSONObject can't be cast to ClassResponse" error after getting a server response. 获取服务器响应后,出现“无法将JSONObject强制转换为ClassResponse”错误。 Im guessing its because the response from server doesn't match the fields in ClassResponse? 我猜是因为服务器的响应与ClassResponse中的字段不匹配? Is it because of the "data" struct in the JSON response? 是否由于JSON响应中的“数据”结构? I have a setter for each of the fields but not sure what I am doing wrong. 我对每个领域都有一个二传手,但不确定我在做什么错。 Is there a way to change the annotation for the Jackson library to parse other layers of the json object? 有没有一种方法可以更改Jackson库的注释以解析json对象的其他层? for instance.. 例如..

@JsonProperty("data:accessToken") or something of that nature... or is that even necessary? @JsonProperty(“ data:accessToken”)或类似性质的东西?或者甚至有必要吗?

server response: 服务器响应:

{
    success: "true"
    message: "Record Created"
    data: {
      userToken : "1"
          }
}

ClassResponse: ClassResponse:

@JsonIgnoreProperties(ignoreUnknown = true)
public class LoginResponse extends Response<LoginResponse.Result>
{
    public static class Result
    {

        private String mUserToken;
        private String mAccessToken;
        private String mUserId;

        public String getUserToken(){
            return mUserToken;
        }

        @JsonProperty("userToken")
        public void setUserToken(final String aUserToken){
            mUserToken = aUserToken;
        }

        public String getAccessToken(){
            return mAccessToken;
        }

        @JsonProperty("accessToken")
        public void setAccessToken(final String aAccessToken){
            mAccessToken = aAccessToken;
        }

        public String getUserId(){
            return mUserId;
        }

        @JsonProperty("user_id")
        public void setUserId(final String aUserId){
            mUserId = aUserId;
        }
    }
}

    (edit)
    @JsonProperty("data")
    public void accessDataLayer(final String data) throws JSONException {

        JSONObject jobj = new JSONObject(data);

        mUserToken = jobj.getString("userToken");
        mAccessToken = jobj.getString("accessToken");
        mUserId = jobj.getString("user_id");

    }



@Override
public RESULT loadDataFromNetwork() throws Exception{
    final String url = buildUrl();

    HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
    String response;

    try{
        conn.setDoInput(true);
        conn.setDoOutput(true);

        MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);

        JSONObject submitInfo = new JSONObject();
        submitInfo = buildParams(entity);

        OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream());
        out.write(submitInfo.toString());
        out.close();

            response = readStream(conn.getErrorStream());

        conn.disconnect();
    }
    return parse(response);

Cause you are trying a desserialize a whole JSONObject in your "LoginResponse.class" collection. 因为您正在尝试在“ LoginResponse.class”集合中反序列化整个JSONObject。 That's no ok, because LoginResponse is an element of the Array "data" in your JSON response, but NOT whole response! 没关系,因为LoginResponse是JSON响应中数组“数据”的元素,但不是整个响应! To get the array you should write something like this 为了得到数组,你应该写这样的东西

 JsonArray data = (JsonArray) JSONObject.getAsJsonArray("data")

And after that you'll get your "data" collection 然后,您将获得“数据”集合

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

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