2017-01-24 3 views
2

Я новичок в Модифицированные и JSON, и я не знаю, как разобрать следующую строку JSON:Android JSON синтаксический дооснащения

{ 
"weight":[ 
    { "bmi":21, 
     "date":"2016-12-09", 
     "fat":14.059000015258789, 
     "logId":1222222222222, 
     "source":"Aria", 
     "time":"11:58:24", 
     "weight":68 
    }, 
    { "bmi":21.83, 
     "date":"2016-12-14", 
     "logId":1222222222223, 
     "source":"Aria", 
     "time":"14:31:39", 
     "weight":70.7 
    } 
] 

}

Я просто хочу «вес» и " date "внутри массива. После некоторых примеров я создал класс pojo, но он не работает. Кроме того, когда я пытаюсь использовать его с классом pojo, я не мог получить «вес» в виде строки (я буду использовать его как двойной), используя .string().

(Я знаю, используя .toString() показывает что-то вроде «[email protected]»).

В настоящем время, я только был в состоянии получить весь JSON через ResponseBody:

Call<ResponseBody>call = repository.getFitbitApi().getData(); 
       call.enqueue(new Callback<ResponseBody>() { 
        @Override 
        public void onResponse(Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) { 
         try { 
          System.out.println(response.body().string()); 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } 
        } 

        @Override 
        public void onFailure(Call<ResponseBody> call, Throwable t) { 

        } 
       }); 

Что я делаю неправильно? Вот мои POJO классы, просто попытка ...:

public class WeightList { 

@SerializedName("weight") 
@Expose 

private ArrayList<WeightLogFitbit> weight = new ArrayList<>(); 

public WeightList(){ 

} 

public ArrayList<WeightLogFitbit> getWeight() { 
    return weight; 
} 


public void setWeight(ArrayList<WeightLogFitbit> weight) { 
    this.weight = weight; 
} 

} А:

public class WeightLogFitbit { 

//Variables in my JSON 
@SerializedName("bmi") 
@Expose 
private String bmi; 

@SerializedName("date") 
@Expose 
private String date; 

@SerializedName("logId") 
@Expose 
private String logId; 

@SerializedName("source") 
@Expose 
private String source; 

@SerializedName("time") 
@Expose 
private String time; 

@SerializedName("weight") 
@Expose 
private double weight; 

@SerializedName("fat") 
@Expose 
private String fat; 

public WeightLogFitbit(){} 

//Getters and setters 
public double getWeight() { 
    return weight; 
} 

public void setWeight(double weight) { 
    this.weight = weight; 
} 

public String getDate() { 
    return date; 
} 
public void setDate(String date) { 
    this.date = date; 
} 

public String getSource() { 
    return source; 
} 
public void setSource(String source) { 
    this.source = source; 
} 

public String getBmi(){ 
    return bmi; 
} 
public void setBmi(String bmi) { 
     this.bmi = bmi; 
    } 

// 
public String getFat(){ 
    return fat; 
} 
public void setFat(String fat) { 
    this.fat = fat; 
} 


public String getTime() { 
    return time; 
} 
    public void setTime(String time) { 
     this.time = time; 
    } 
public String getLogId() { 
    return logId; 
} 
public void setLogId(String logId) { 
     this.logId = logId; 
} 

}

ПРИМЕЧАНИЕ: Я использую RxSocialConnect библиотеку, которая реализует RxJava , Дооснащение 2, OkHttp3 и gson, на всякий случай. Я сделал это следующим образом: this.

Остальных классов Я использую:

public class FitbitBtnActivity extends AppCompatActivity { 

private FitbitRepository repository; 

    @Override protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_fitbit_btn); 

     repository = new FitbitRepository(); 

     setUpFitbit(); 

    } 


private void setUpFitbit() { 
    findViewById(R.id.fitbitbtn).setOnClickListener(v -> 
      RxSocialConnect.with(this, repository.fitbitService()) 
        .subscribe(response -> response.targetUI().showToken(response.token()), 
          error -> showError(error)) 
    ); 

    findViewById(R.id.retrievebtn).setOnClickListener(v -> { 
    Call<ResponseBody>call = repository.getFitbitApi().getData(); 
       call.enqueue(new Callback<ResponseBody>() { 
        @Override 
        public void onResponse(Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) { 
         try { 
          System.out.println(response.body().string()); 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } 
        } 

        @Override 
        public void onFailure(Call<ResponseBody> call, Throwable t) { 

        } 
       }); 

       //Original code from example in RxSocialConnect 

         /*.subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Action1<Object>() { 
           @Override 
           public void call(Object user) { 
            FitbitBtnActivity.this.showUserProfile(user.toString()); 
           } 
          }, 
         error -> FitbitBtnActivity.this.showError(error));*/ 

    } 
    ); 
} 

И:

public class FitbitRepository { 


private final FitbitApiRest fitbitApi; 

public FitbitRepository() { 
    fitbitApi = initFitbitApiRest(); 
} 

private FitbitApiRest initFitbitApiRest() { 
    OkHttpClient client = new OkHttpClient.Builder() 
      .addInterceptor(new OAuth2Interceptor(FitbitApi20.class)) 
      .build(); 

    return new Retrofit.Builder() 
      .baseUrl(FitbitApiRest.URL_BASE) 
      .client(client) 
      .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build().create(FitbitApiRest.class); 
} 



FitbitApiRest getFitbitApi() { 
    return fitbitApi; 
} 



interface FitbitApiRest { 
    String URL_BASE = "https://api.fitbit.com"; 

    @GET("myrequest.json") 
    Call<ResponseBody> getData(); 
} 

OAuth20Service fitbitService() { 


    final String client_id = "xxxxx"; 
    final String client_secret = "1xxxxxxxxxxxxxxxxxx"; 
    final String redirect_uri = "http://example.com"; 
    final String permissions = "weight"; 

    return new ServiceBuilder() 
      .apiKey(client_id) 
      .apiSecret(client_secret) 
      .callback(redirect_uri) 
      .scope(permissions) 
      .build(FitbitApi20.instance()); 
} 

}

+0

Как ваш Pojo выглядеть? – MoQ93

+0

http://stackoverflow.com/questions/21881943/how-can-i-return-string-or-jsonobject-from-asynchronous-callback-using-retrofit – Nobody

+0

@MoQ см. Редактирование для классов pojo. Спасибо за интерес. – mmateo

ответ

1

Вы должны добавить это к вашим зависимостям:

compile 'com.squareup.retrofit2:converter-gson:your-version' 

и затем добавьте gson-конвертер в ваш Retrofi т пример, как это:

Retrofit retrofit = new Retrofit.Builder() 
.baseUrl("https://api.example.com") 
.addConverterFactory(GsonConverterFactory.create()) 
.build(); 

и изменить ваш вызов в апи вернуться WeightList:

Call<WeightList> getData(); 
+0

Пожалуйста, смотрите мой обновленный вопрос. Там есть весь код, который у меня есть. И я использую 'compile 'com.squareup.retrofit2: converter-gson: 2.1.0'' – mmateo

+0

вам нужно сделать третий шаг в моем ответе, чтобы автоматически его разобрать, а затем в вашем обратном вызове: response.body() should быть вашим разобранным объектом – MoQ93

+0

, если мои классы pojo прекрасны и после внесенных изменений, если я напечатаю response.body() в моем обратном вызове, я получаю что-то вроде com.myPackage.MyPojo @ xxxx ". Моя самая большая проблема - принять вес как переменную, которую я смогу использовать позже. Извините, если это кажется простым или я пропускаю некоторые вещи, это мой первый раз с этим. – mmateo

Смежные вопросы