Разбор библиотеки Android Jackson

Я получаю сообщение об ошибке «JSONObject не может быть передано в ClassResponse» после получения ответа сервера. Я предполагаю, что это потому, что ответ сервера не соответствует полям в ClassResponse? Это из-за структуры «данных» в ответе JSON? У меня есть сеттер для каждого из полей, но я не уверен, что я делаю неправильно. Есть ли способ изменить аннотацию для библиотеки Джексона для анализа других слоев объекта json? например..

@JsonProperty("data:accessToken") или что-то в этом роде... или это вообще необходимо?

ответ сервера:

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

КлассОтвет:

@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);

person AK824    schedule 11.12.2013    source источник
comment
Покажите полный класс и код, который вы используете для десериализации json.   -  person Sotirios Delimanolis    schedule 12.12.2013


Ответы (1)


Потому что вы пытаетесь десериализовать весь JSONObject в своей коллекции «LoginResponse.class». Это не нормально, потому что LoginResponse является элементом «данных» массива в вашем ответе JSON, но НЕ весь ответ! Чтобы получить массив, вы должны написать что-то вроде этого

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

И после этого вы получите свою коллекцию "данных"

person whizzzkey    schedule 12.12.2013
comment
эй, свист, спасибо за ваш ответ, я подумал об этом вчера после того, как опубликовал и изменил что-то вроде этого .. однако я все еще получаю сообщение об ошибке невозможности приведения (поместите изменение внизу исходного сообщения) - person AK824; 12.12.2013
comment
@ AK824 AK824 Я только что посмотрел изменения в вашем коде, можете ли вы опубликовать метод, в котором вы подключаетесь к серверу и вызываете accessDataLayer? Я думаю, что проблема может заключаться в том, что вы даете json как строку в вашем accessDataLayer - person whizzzkey; 13.12.2013
comment
@AK824 Я советую вам использовать code.google.com/p/google-gson Вместо Джексона. Это библиотека, которая позволяет вам получать объекты из json без каких-либо аннотаций, парсинга или чего-то скучного. Просто переименуйте поля в вашем классе Result с теми же именами в вашей структуре данных json, и теперь вы можете работать с gson, наслаждайтесь. - person whizzzkey; 13.12.2013
comment
@whizzkey Я использую robospice и jackson, я пытаюсь перенести старый API на новый, не меняя библиотеки... У меня есть родительские/дочерние классы результатов для обработки различных значений входящего json для успеха и данных, но с труднее всего найти правильную комбинацию для этого проекта - person AK824; 13.12.2013
comment
@ AK824 AK824 Я говорил вам использовать gson, это действительно самый простой способ получить любые объекты из json в объект java. Прочитайте мой ответ здесь stackoverflow.com/a/20467664/2504010 - person whizzzkey; 13.12.2013