Ответ 1
Проблема была в моем php файле. Удаление массива контейнеров из json-кодированного объекта заставило мой java-код работать.
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://my.server:8080/android/service.php");
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("action", "getjson"));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
service.php
генерирует строку json. Как мне получить его из моего response
? Btw; Я включил библиотеку GSON
, могу ли я использовать любые методы в ней, возможно?
Решения, подобные этому, выглядят довольно уродливо, imo: лучший способ обработать json из httpresponse android
Есть много лучших способов, верно?
Любая помощь приветствуется, спасибо
Update:
String json = EntityUtils.toString(response.getEntity());
похоже, делает трюк. Есть только одна небольшая проблема: строка обернута скобками []
. Должен ли я удалить их вручную? Они генерируются php: s json_encode()
Проблема была в моем php файле. Удаление массива контейнеров из json-кодированного объекта заставило мой java-код работать.
Я думаю, что проблема, с которой вы сталкиваетесь, похожа на мою собственную, с которой я столкнулся. Если вы запустите:
String json_string = EntityUtils.toString(response.getEntity()); JSONObject temp1 = new JSONObject(json_string);
Вышеприведенный код генерирует исключение, и похоже, что в нем виноваты скобки массива JSON. Но отлично, чтобы массив JSON был элементом верхнего уровня! Вам просто нужно использовать JSONArray() вместо JSONObject:
String json_string = EntityUtils.toString(response.getEntity()); JSONArray temp1 = new JSONArray(json_string);
Итак, вы должны знать, получаете ли вы JSONArray или один словарь, который является JSONObject в коде JSON.
Если вы привыкли к библиотекам разбора iOS/ Objective-C JSON, они используют один и тот же элемент верхнего уровня для работы с json-словарями и json-массивами, поэтому переход к миру JAVA/Android смутил меня в том, что у меня два типа для обработки JSON в зависимости от возвращаемого верхнего уровня.
С помощью этого класса вы можете получать данные JSON либо с сервера, либо из вашей папки с ресурсами. Его можно легко изменить только на тот или иной. Если вам нужен адаптер, используйте jgilfelt, созданный здесь на getHub.
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Bundle getArgs = this.getArguments();
String URI = getArgs.getString(KEY_URI);//OR YOU CAN HARD CODE THIS OR GET THE STRING ANYWAY YOU LIKE.
new GetJSONTask().execute(URI);
}
class GetJSONTask extends AsyncTask<String, Integer, String> {
protected String doInBackground(String... arg0) {
String uri = arg0[0];
InputStream is = null;
if (uri.contains("http") == true) {// Get JSON from URL
try {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(uri);
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
BufferedReader rd = new BufferedReader(new InputStreamReader(is, "UTF-8"));
while ((line = rd.readLine()) != null) {
json += line;
}
rd.close();
return json;
} catch (Exception e) {
e.printStackTrace();
return null;
}
} else {// Get JSON from Assets
Writer writer = new StringWriter();
char[] buffer = new char[1024];
try {
InputStream jsonFile = getActivity().getAssets().open(uri);
Reader reader = new BufferedReader(new InputStreamReader(jsonFile, "UTF-8"));
int n;
while ((n = reader.read(buffer)) != -1) {
writer.write(buffer, 0, n);
}
jsonFile.close();
} catch (IOException e) {
e.printStackTrace();
}
json = writer.toString();
// return JSON String
return json;
}
}
@Override
protected void onPostExecute(String result) {
try {
showData(result);
} catch (JSONException e) {
e.printStackTrace();
Toast.makeText(getActivity(), "something went wrong", Toast.LENGTH_SHORT).show();
}
}
}
private void showData(String json) throws JSONException {
JSONObject o = new JSONObject(json);
JSONArray data = o.getJSONArray("results");
}
}
Если я возвращаю строку JSON из моей веб-службы, я обычно хочу вернуть ее к объекту JSON, например:
String response = client.getResponse();
if (responseCode == 200)
{
JSONObject obj = new JSONObject(response);
}