我正在尝试从外部源检索JSON数据进行练习。我已经得到了所有的代码到位,但由于某种原因,我得到一个错误,说该文件是没有完全消费。我已经看过和阅读了多个教程和指南,但似乎仍然不能得到它的权利。我也在stack中寻找答案,但由于我不知道哪里出了问题,我真的不知道要找什么。
所有的代码都在适当的位置,没有明显的错误。JSON数据已经过验证,它可以作为原始JSON数据进行检索,如日志中所示。当数据应该传输到java数据类时,问题发生在Gson转换中。有什么想法可能是错的吗?
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:
{“反序列化容器列表”:[{“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。也就是说,没有数据被添加到列表中...嗯,至少它不会坠毁,多亏了劳伦特·B,所以又近了一步。
3条答案
按热度按时间xxslljrj1#
值被传递,但是null也被传递,所以使用if语句而不是像这样使用while。
字符串
然后像这样转换成Gson..
型
在
DeserializedVariables
类中编写getter和setter型
现在你可以像这样在你的
onPostExecute()
中检索它。型
ybzsozfc2#
您的completeJSONdata不正确,因为您总是将“null”放在末尾。
你的while子句应该是:
字符串
顺便说一句,不要忘记关闭你的流,例如使用try:
型
bfhwhh0e3#
对于那些仍然在为这个例外而奋斗的人:对我来说,唯一有效的解决方案是在将JSON提交给Gson之前将其漂亮地打印出来(我有一种预感,也许格式本身有问题,尽管它没有抛出JsonMalformattedError)。下面是为我工作的代码:
字符串
您可以继续将
jsonPretty
作为字符串传递给Gson。这使得GSON完全使用JSON文档。我相信这个库在处理非常不连贯的JSON时会遇到困难(例如,当有太多白色或其他东西时)。我不知道为什么,但至少这对我有用。