2017-05-08 78 views
0

我正在学习改造,我只是试图将json转换为gson。也许这是因为我不熟悉链接的json格式的结构。我尝试了更简单的格式和应用程序的另一个链接。我想查询“数据”中的内容。我希望你能给我一些建议,弄清楚什么是错的。顺便说一下,我为这两个链接制作了单独的应用程序。但是这个过程是相似的。应用程序崩溃而不显示错误(Retrofit 2)

这里是我应该是工作的链接:

Link that makes app crash

下面是本教程

working link

这里给出的链接是我的接口:

public interface HTTPService { 

@GET("/organizations?type=json") 
Call<Organization> getMyJSON(); 

}

这里是我的客户:

public class HTTPClient { 
private static final String ROOT_URL = "http://isteward.tastradedev.com/api"; 

/** 
* Get Retrofit Instance 
*/ 
private static Retrofit getRetrofitInstance() { 
    return new Retrofit.Builder() 
      .baseUrl(ROOT_URL) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build(); 
} 

/** 
* Get API Service 
* 
* @return API Service 
*/ 
public static HTTPService getApiService() { 
    return getRetrofitInstance().create(HTTPService.class); 
} 

}

这里是我的MainActivvity:

public class MainActivity extends AppCompatActivity { 
private ListView listView; 
private View parentView; 

private ArrayList<Datum> datalist; 
private ListAdapter adapter; 
ProgressDialog dialog; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    datalist = new ArrayList<>(); 
    parentView = findViewById(R.id.parentlayout); 


    listView = (ListView) findViewById(R.id.listView); 


    dialog = new ProgressDialog(MainActivity.this); 
    dialog.setTitle("Fetching Data"); 
    dialog.setMessage("Please wait..."); 
    dialog.show(); 

    //Creating an object of our api interface 
    HTTPService api = HTTPClient.getApiService(); 

    Call<Organization> call = api.getMyJSON(); 

    call.enqueue(new Callback<Organization>() { 
     @Override 
     public void onResponse(Call<Organization> call, Response<Organization> response) { 
      //Dismiss Dialog 
      dialog.dismiss(); 

      if (response.isSuccessful()) { 

       datalist = response.body().getData(); 


       adapter = new ListAdapter(MainActivity.this, datalist); 
       listView.setAdapter(adapter); 

      } else { 
       Toast.makeText(MainActivity.this, "error", Toast.LENGTH_SHORT).show(); 
      } 
     } 

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

     } 
    }); 
} 

}

我使用jsonschema2pojo生成的类。 链接由3个类组成。我想这会让我的帖子太长。感谢您的帮助。

编辑:我想我必须包括我的适配器

这里是我的适配器的某些部分:

public class ListAdapter extends ArrayAdapter<Datum> { 
ArrayList<Datum> datalist; 
Context context; 

private LayoutInflater inflater; 


public ListAdapter(Context context, ArrayList<Datum> objects) { 
    super(context, 0, objects); 
    this.context = context; 
    this.inflater = LayoutInflater.from(context); 
    datalist = objects; 
} 

@Override 
public Datum getItem(int position) { 
    return datalist.get(position); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    final ViewHolder vh; 
    if (convertView == null) { 
     View view = inflater.inflate(R.layout.row, parent, false); 
     vh = ViewHolder.create((RelativeLayout) view); 
     view.setTag(vh); 
    } else { 
     vh = (ViewHolder) convertView.getTag(); 
    } 
+0

尝试使用okhttp HttpLoggingInterceptor从服务器调试您的响应。 –

+0

Android监视器中必须有日志猫条目。请粘贴在这里,我们需要检查它。 – Vucko

+0

这里呼叫<组织>您从服务器获得组织,但api显示它是小孩。如果你从jsonschema2pojo生成类然后使用Example类。如致电

回答

0

首先,当你使用改装请按照以下

http://isteward.tastradedev.com 

请只提供改造域之后,应该在这样的界面去

@GET("api/organizations?type=json") 

,请不要在根URL后添加任何斜杠

http://isteward.tastradedev.com 

@GET("/api/organizations?type=json") 

而且我还看到了一些空字符串在你的回应。请将它们转换为空或传递其他内容(这可能是您的问题)。

+0

这个伎俩!我提出了我不需要的值,然后我将baseURL设置为“http://isteward.tastradedev.com”。谢谢! – Dubutski

0

我的名誉不允许我评论了你的问题,但你不能只将json转换为字符串,然后将字符串转换为gson?

+0

抱歉,先生,但我的任务是做“自动gson” – Dubutski

0

对于获取特定数组/字符串,您必须使用父对象来获取DATA。您无法直接使用该POJO获取嵌套数组。所以更改API类按如下:

首先请从服务器接收整个JSON API接口:

@GET("/organizations?type=json") 
Call<Example> getMyJSON(); 

这里的例类包含JSON resonse的的getter/setter。

现在,当您申请API,使用该类回调顺利拿到响应,

Call<Example> call = api.getMyJSON(); 

    call.enqueue(new Callback<Example>() { 
     @Override 
     public void onResponse(Call<Example> call, Response<Example> response) { 
      //Dismiss Dialog 
      dialog.dismiss(); 

      if (response.isSuccessful()) { 

     /*** HERE response.body contains whole JSON, you need to pass through whole chain to get desire Data. SO Organization class conatains DATA so use it like***/ 

       datalist = response.body().getOrganization().getData();; 

     /--- datalist is list of Datum array list. now pass that to adapter ---/ 

       adapter = new ListAdapter(MainActivity.this, datalist); 
       listView.setAdapter(adapter); 

      } else { 
       Toast.makeText(MainActivity.this, "error", Toast.LENGTH_SHORT).show(); 
      } 
     } 

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

     } 
    }); 
+0

除了代码示例,请添加说明,以便有相似问题的人可以通过阅读您的提示来获取上下文。 – tommus

+0

仍然崩溃。当我追溯代码的流程时,它应该起作用。我真的不知道是什么让应用程序崩溃。 – Dubutski

+0

然后发布完整的错误日志来解决它 –

相关问题