我已粘贴下面的代码,如果有人帮我解决问题,我会很感激。当我运行我的活动时,列表应该在我的应用程序内部进行更新。我无法提取任何数据。当我首先记录 时,我会得到 [] ,而不是其他内容。如果我检查尺寸,它会以 0 的形式返回。
*我希望检索ID,名称和尺寸,并将它们放在列表视图中的textview中。
当我从浏览器访问我的URL字符串时,我得到了这个:
{ "begin":
[
{"id":1,"name":"1","size":2},
{"id":2,"name":"2","size":2}],
"end":
[
{"id":1,"name":"1","size":2},
{"id":2,"name":"2","size":2}
]
}
模型/ Main.java
import android.content.Context;
import ...Cement;
import ...utils.NetworkUtilities;
import ...utils.ServerErrorException;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import java.util.ArrayList;
import java.util.List;
public class Main {
private String id;
private String name;
private static List<Main> first;
public Main() {}
public String getId() {
return id;
}
public String getName() {
return name;
}
/**
* @return array of Main.
* @throws JSONException
*/
public static List<Main> updateMain(Context context) throws JSONException, ServerErrorException {
List<NameValuePair> params = new ArrayList<NameValuePair>();
if( Member.session(context) != null ) {
params(new BasicNameValuePair(Cement.ACCESS_CODE, Member.session(context).getAccessCode()));
} else {
return null;
}
String URL = Cement.BASE_URL + Cement.MAIN_URI;
String jsonString = NetworkUtilities.SendHttpGet(URL, params);
if (jsonString == null) return main(context);
JSONParse parser = new JsonParser();
JSONObject jsonObject = parser.parse(jsonString).getAsJsonObject();
if (jsonObject != null && jsonObject.get("begin") != null) {
Gson gson = new Gson();
for (JSONElement mainObject : jsonObject.get("begin").getAsJsonArray()) {
Main spot = gson.fromJson(mainObject.getAsJsonObject().get("begin"), Main.class);
Main.setSpot(context,spot);
}
} else {
// Server error exception...
}
return first(context);
}
public static List<Main> first(Context context) {
if (first == null) {
try {
first = new ArrayList<Main>();
} finally {
if (first == null) {
first = new ArrayList<Main>();
}
}
}
return first;
}
public static void setMain(Context context, Main second) {
Main previous = find(context, second.getId());
if (previous != null) {
first.set(first.indexOf(previous), second);
} else {
first = first(context);
first.add(second);
}
}
public static Main find(Context context, String id) {
for(Main first : first(context)) {
if(second.getId().equals(id)) {
return second;
}
}
return null;
}
}
活动/ Home.java
public class Home extends Fragment {
private GetMainListTask mGetMainListTask = null;
private ListView mMainListView;
private MainListAdapter mMainListAdapter;
private List<Main> mFirst;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment, container, false);
mFirst = First.first(mContext);
mMainListView = (ListView) rootView.findViewById(R.id.ListView);
mMainListAdapter = new MainListAdapter();
mMainListView.setAdapter(mMainListAdapter);
getFirst(true);
return rootView;
}
public void getFirst(Boolean showProgressDialog){
if (showProgressDialog) {
mProgressDialog = ProgressDialog.show(mContext, "", "Loading...", true);
}
mGetMainListTask = new GetMainListTask();
mGetMainListTask.execute();
}
public class GetMainListTask extends AsyncTask<Void, Void, List<Main>> {
private List<Exception> exceptions = new ArrayList<Exception>();
@Override
protected List<Main> doInBackground(Void... params) {
try {
return Main.updateMain(Home.this.getApplicationContext());
} catch (ServerErrorException e) {
exceptions.add(e);
return null;
} catch (JSONException e) {
exceptions.add(e);
return null;
} catch (Exception e) {
return null;
}
}
@Override
protected void onPostExecute(final List<Main> first) {
for (Exception e : exceptions) {
// Error...
}
if(first == null && exceptions.isEmpty()) {
if (getApplicationContext() != null) {
// Error...
}
}
onGetMainResult(first);
}
}
public void onGetMainResult(List<Main> first) {
boolean worked = (first != null && first.size() != 0);
mGetMainListTask = null;
if (worked) {
mFirst = first;
if (mMainListAdapter != null) {
mMainListAdapter.notifyDataSetChanged();
}
}
}
public class MainListAdapter extends BaseAdapter {
@Override
public int getCount() {
return mFirst.size();
}
@Override
public Object getItem(int i) {
return mFirst.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View convertView, ViewGroup parent) {
View view = View.inflate(getApplicationContext(), R.layout.list, null);
final Main first = mFirst.get(i);
if (mContext != null && first != null) {
// Do stuff...
}
return view;
}
}
答案 0 :(得分:1)
在我看来,你正试图以过于复杂的方式使用Gson。
(另外,代码中的JSONParse
和JSONObject
是什么?显然来自org.json或Jackson。为什么你会在同一段代码中使用几个不同的JSON库?去Gson!)
如果我们从您的原始JSON字符串开始:
{ "begin":
[
{"id":1,"name":"1","size":2},
{"id":2,"name":"2","size":2}],
"end":
[
{"id":1,"name":"1","size":2},
{"id":2,"name":"2","size":2}
]
}
将这种模型转换为Java对象的一种自然方式就是这样,使用两个类:
public class TopLevel {
List<Main> begin;
List<Main> end;
}
public class Main {
String id;
String name;
}
(随意将“TopLevel”重命名为更好的内容,以及它在您的应用程序中代表的内容。)
现在,将JSON解析为Java对象(一个包含总共4个Main对象的TopLevel对象)非常简单:
Gson gson = new GsonBuilder().create();
TopLevel topLevel = gson.fromJson(jsonString, TopLevel.class);