我正在练习从外部源检索JSON数据。我已经完成了所有代码,但出现了一个错误,提示文档没有完全消耗。我观看了多个教程和指南,但仍然无法解决问题。我也在stack上搜寻答案,但由于我不知道哪里出了问题,所以我不知道该搜寻什么。
所有的代码都已经准备就绪,也没有明显的错误。JSON数据已经过验证,并且可以作为原始JSON数据进行检索,如日志中所示。问题出现在Gson转换时,当数据应该传递到Java数据类时。有任何建议吗?
所有的代码都已经准备就绪,也没有明显的错误。JSON数据已经过验证,并且可以作为原始JSON数据进行检索,如日志中所示。问题出现在Gson转换时,当数据应该传递到Java数据类时。有任何建议吗?
public class JSONimport extends AsyncTask<Void, Void, DeserializedContainer> {
private static final String TAG = "TAG";
//VARIABLES TO HOLD JSON DATA
private OnLoadListener mListener;
//CONSTRUCTOR
public JSONimport(OnLoadListener listener) {
this.mListener = listener;
}
//ASYNK, DO IN BACKGROUND THREAD
@Override
protected DeserializedContainer doInBackground(Void... voids) {
String myJSON = ""; //TEMP VARIABLE TO HOLD JSON DATA
String completeJSONdata = ""; //VARIABLE TO HOLD COMPLETE JSON DATA
try {
URL urlObject = new URL( "https://api.myjson.com/bins/161kkd" );
HttpURLConnection httpURLConnection = (HttpURLConnection) urlObject.openConnection();
InputStream inputStreamObject = httpURLConnection.getInputStream();
BufferedReader bufferedReaderObject = new BufferedReader( new InputStreamReader( inputStreamObject ) );
while (myJSON != null) {
myJSON = bufferedReaderObject.readLine();
completeJSONdata += myJSON;
}
} catch (MalformedURLException e) {
e.printStackTrace();
Log.d( TAG, "doInBackground: ERROR RETRIEVING URL" );
} catch (IOException e) {
e.printStackTrace();
Log.d( TAG, "doInBackground: ERROR HTTP CONNECTION" );
}
//DESERIALIZATION, converting JSON to java variables, making the data easy to handle
Gson gsonObject = new GsonBuilder()
.setLenient()
.create();
DeserializedContainer deserializedContainerObject;
deserializedContainerObject = gsonObject.fromJson( completeJSONdata, DeserializedContainer.class );
//Log.d( TAG, "doInBackground: " + deserializedContainerObject.getDeserializedContainerList() );
return deserializedContainerObject;
}
@Override
protected void onPostExecute(final DeserializedContainer result) {
mListener.onSuccess( result );
//FUNKAR ATT HÄMTA JSON DATA. KOLLA LOGCAT
Log.d( TAG, "onPostExecuteLOL: " + result );
}
public static interface OnLoadListener {
void onSuccess(DeserializedContainer container);
}}
错误出现在deserializedContainerObject = gsonObject.fromJson(completeJSONdata, DeserializedContainer.class);
用于保存JSON数据的数据对象:
public class DeserializedContainer {
@SerializedName("deserializedContainerList")
public List<DeserializedVariables> deserializedContainerList = new ArrayList<>();
public List<DeserializedVariables> getDeserializedContainerList() {
return deserializedContainerList;
}}
public class DeserializedVariables {
@SerializedName( "movieName" )
private String movieName;
@SerializedName( "movieYear" )
private int movieYear;
@SerializedName( "movieRating" )
private double movieRating;}
主线程的相关数据:
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate( savedInstanceState );
setContentView( R.layout.activity_main );
//BACKGROUND THREAD
JSONimport jsonImportObject = new JSONimport( new JSONimport.OnLoadListener() {
@Override
public void onSuccess(DeserializedContainer container) {
container.getDeserializedContainerList();
}
} );
jsonImportObject.execute();
//Log.d( TAG, "onCreateGETTING DATA : " + jsonImportObject.getCompletedData());
DeserializedContainer deserializedContainerObject = new DeserializedContainer();
Log.d( TAG, "onCreate: " + deserializedContainerObject);
JSON:
{"deserializedContainerList":[{"movieName":"filmA","movieYear":2017,"movieRating":4.7},{"movieName":"filmB","movieYear":2018,"movieRating":4.8},{"movieName":"filmC","movieYear":2019,"movieRating":4.9}]}
很抱歉这篇文章很长,希望你有精力阅读。我遇到了困难。虽然我知道Retrofit和类似的库,但我已经花了很多时间来解决这个问题,所以我不想放弃它 :P
谢谢!
/////// 更新 /////// 我根据Laurent B的建议更新了代码,并且它起作用了!或者说至少没有崩溃。我尝试使用以下代码在主线程上打印列表:
for(int i = 0; i < deserializedContainerObject.deserializedContainerList.size(); i++) {
Log.d( TAG, "onCreate: " + deserializedContainerObject.deserializedContainerList.get( i ));
}
但是没有任何显示。当检查deserializedContainerObject.deserializedContainerList.size()时,它显示为0。也就是说,没有数据被添加到列表中... 嗯。至少由于Laurent B的帮助,它没有崩溃,离成功又近了一步。
onSuccess
方法的DeserializedContainer container
中检查了对象?deserializedContainerObject
在onSuccess
方法之外声明,因此它的列表大小为0是有道理的。 - Dave Thomas