[英]How to parse JSON with Retrofit
I have problem with parsing Json in Retrofit. 我在Retrofit中解析Json时遇到问题。 My URL: http://192.168.0.102:8000/api/get_services?keyword=someword
我的网址: http : //192.168.0.102 : 8000/api/get_services?keyword=someword
Someword here is the word which user writes in dialog window. 这里的Someword是用户在对话框窗口中写的单词。
I need only 我只需要
Here I have null in coords. 这里的坐标为空。 I want to take the results and show it Google Maps.
我想获取结果并将其显示在Google Maps中。
What's wrong? 怎么了? How I can fix problem?
我该如何解决问题?
JSON: JSON:
LocationActivity.java 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 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 ApiCalls.java
public interface ApiCalls {
@GET("/api/get_services")
void getPosition(@Query("keyword") Words words, Callback<PositionResponse> responseCallback);
}
PositionResponse.java 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;
}
}
As dabluck told you, you web service is responding with a JSONArray, so you will need to wrap your response around a List (for example). 正如dabluck告诉您的那样,您的Web服务正在使用JSONArray进行响应,因此您需要将响应包装在List周围(例如)。
Something like this should work: 这样的事情应该起作用:
public class ListPositionResponse {
private List<PositionResponse> service_list;
public ListPositionResponse(List<PositionResponse> service_list){
this.service_list = service_list;
}
}
So you retrofit call will be: 因此,您的改造电话将是:
public interface ApiCalls {
@GET("/api/get_services")
void getPosition(@Query("keyword") Words words, Callback<ListPositionResponse> responseCallback);
}
Hope it will help you. 希望对您有帮助。
EDIT: To get the coords for each PositionResponse
: 编辑:要获取每个
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]);
}
your positionresponse object isn't correct. 您的positionresponse对象不正确。 you need a servicelist object in there.
您在那里需要一个servicelist对象。 use jsonschema2pojo.org to generate objects and try again
使用jsonschema2pojo.org生成对象,然后重试
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.