[英]How to parse JSON with Retrofit
我在Retrofit中解析Json時遇到問題。 我的網址: http : //192.168.0.102 : 8000/api/get_services?keyword=someword
這里的Someword是用戶在對話框窗口中寫的單詞。
我只需要
這里的坐標為空。 我想獲取結果並將其顯示在Google Maps中。
怎么了? 我該如何解決問題?
JSON:
LocationActivity.java
private void showInputDialog(){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
final LayoutInflater inflater = this.getLayoutInflater();
View dialogView = inflater.inflate(R.layout.dialog_search, null);
builder.setView(dialogView);
final EditText inputSearch = (EditText) dialogView.findViewById(R.id.input_service);
inputSearch.setInputType(InputType.TYPE_CLASS_TEXT);
builder.setPositiveButton("Поиск", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
final String SearchPosition = inputSearch.getText().toString();
if (SearchPosition.matches("")) { //Check if EditText is empty
Toast.makeText(getApplicationContext(), "Space is empty!", Toast.LENGTH_SHORT).show();
return;
} else {
NetworkFactory.getInstance().getApiCall().getPosition(new Words(SearchPosition), new Callback<PositionResponse>() {
@Override
public void success(PositionResponse positionResponse, Response response) {
Log.d("Result: ", Arrays.toString(positionResponse.getPosition()).replaceAll("\\[|\\]", ""));
if (positionResponse.getPosition() == null) {
//Toast Message
Toast.makeText(getApplicationContext(), "There is no such result! Try again!", Toast.LENGTH_LONG).show();
} else {
String mLatLng = Arrays.toString(positionResponse.getPosition()).replaceAll("\\[|\\]", "");
String[] arrayLatLng = mLatLng.split(","); //separate out lat and lon
LatLng positionLatLon = new LatLng(Double.parseDouble(arrayLatLng[0]), Double.parseDouble(arrayLatLng[1])); //create the LatLng object
mGoogleMap.addMarker(new MarkerOptions().position(positionLatLon)
.title("Result")
.snippet("Result of search: " + SearchPosition)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.icon_location)));
CameraPosition cameraPosition = new CameraPosition.Builder().target(positionLatLon).zoom(17).build();
mGoogleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
}
}
@Override
public void failure(RetrofitError error) {
error.toString();
}
});
}
}
});
builder.show();
}
NetworkFactory.java
public class NetworkFactory {
public static final String API_URL = "http://192.168.0.102:8000";
private static NetworkFactory ourInstance = new NetworkFactory();
private ApiCalls apiCalls;
private NetworkFactory() {
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(API_URL)
.build();
apiCalls = restAdapter.create(ApiCalls.class);
}
public static NetworkFactory getInstance() {
return ourInstance;
}
public ApiCalls getApiCall() {
return apiCalls;
}
}
ApiCalls.java
public interface ApiCalls {
@GET("/api/get_services")
void getPosition(@Query("keyword") Words words, Callback<PositionResponse> responseCallback);
}
PositionResponse.java
public class PositionResponse {
private double[] coords;
private String address;
private String company_name;
public double[] getPosition() {
return coords;
}
public void setPosition(double[] coords) {
this.coords = coords;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getCompanyName() {
return company_name;
}
public void setCompanyName(String company_name) {
this.company_name = company_name;
}
}
正如dabluck告訴您的那樣,您的Web服務正在使用JSONArray進行響應,因此您需要將響應包裝在List周圍(例如)。
這樣的事情應該起作用:
public class ListPositionResponse {
private List<PositionResponse> service_list;
public ListPositionResponse(List<PositionResponse> service_list){
this.service_list = service_list;
}
}
因此,您的改造電話將是:
public interface ApiCalls {
@GET("/api/get_services")
void getPosition(@Query("keyword") Words words, Callback<ListPositionResponse> responseCallback);
}
希望對您有幫助。
編輯:要獲取每個PositionResponse
的坐標:
public class ListPositionResponse {
private List<PositionResponse> service_list;
public ListPositionResponse(List<PositionResponse> service_list){
this.service_list = service_list;
}
public List<PositionResponse> getPositions(){
return this.service_list;
}
// And In your Activity
public void showCoords(ListPositionResponse positionResponse){
for(PositionResponse position : positionResponse.getPositions()){
doSomethingWithPosition(position);
}
}
public void doSomethingWithPosition(PositionResponse position){
double[] coords = position.getPosition();
LatLng positionLatLon = new LatLng(double[0], double[1]);
}
您的positionresponse對象不正確。 您在那里需要一個servicelist對象。 使用jsonschema2pojo.org生成對象,然后重試
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.