Java: Почему не получается обработать JSON?

Добрый день! Я получаю с сервера JSON-файл следующим образом:
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(params[0]); // params[0] - URL-адрес

ArrayList<NameValuePair> param = new ArrayList<NameValuePair>();

try {
    httpPost.setEntity(new UrlEncodedFormEntity(param));
    HttpResponse httpResponse = httpClient.execute(httpPost);
    HttpEntity httpEntity = httpResponse.getEntity();

    is = httpEntity.getContent();
} catch (Exception e) {
    System.out.println("Error: " + e.getMessage());
    return false;
}


Далее обрабатываю его:
try {
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(is));
    StringBuilder stringBuilder = new StringBuilder();
    String line = "";
    while ((line = bufferedReader.readLine()) != null) {
        stringBuilder.append(line + "\n");
    }
    is.close();

    // Переменная result содержит JSON-код, полученный с сервера
    result = stringBuilder.toString();

    jsonParser(result);

    return true;
} catch (Exception e) {
    System.out.println("Error: " + e.getMessage());
    return false;
}


public void jsonParser(String result) {
    text.setText(result);
    try {
        JSONObject jsonObject = new JSONObject(result);
        JSONArray entries = jsonObject.getJSONArray("plans");

        for (int i = 0; i < entries.length(); i++ ) {
            JSONObject post = entries.getJSONObject(i);
            idResult[i] = post.getString("ID");
        }
    } catch (Exception e) {
        System.out.println("Error jsonParser(): " + e.getMessage());
    }
}


В итоге срабатывает исключение
Error jsonParser(): null

Почему null? Как правильно обработать JSON, находящийся в строке?
  • Вопрос задан
  • 5284 просмотра
Решения вопроса 1
@Eserchik
Для начала тебе нужно точно знать что тебе возвращает сервер, для этого можно например установить расширение для Chrome - Postman REST CLIENT(сформировать в нем свой запрос и посмотреть какую json структуру он возвращает).
В своем коде ты не передаешь серверу какие либо данные, у тебя конструкция:
ArrayList<NameValuePair> param = new ArrayList<NameValuePair>();
-пустая. Ты отправляешь тока некий пустой заголовок. Должно быть так например:
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(3);
	        nameValuePairs.add(new BasicNameValuePair("grant_type", "password"));
	        nameValuePairs.add(new BasicNameValuePair("password", pass));
	        nameValuePairs.add(new BasicNameValuePair("username", login));
	        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));


Json ответ может быть простой:
{
    "name": "Иванов Сергей",
    "phone": "89651102121"
}

Тогда вот:
if(result != null){
				
	  			try{
	  				final JSONArray jArray = new JSONArray(result);
	  	               
	  				   for(int i=0;i<jArray.length();i++) 
	  				      {
	  					     JSONObject json_data = jArray.getJSONObject(i);
	  					
	  					  String  name = json_data.getString("name");
	  					  String phone =json_data.getString("phone");
	  				
	  	                  }
	  	          }catch(JSONException e1){
	  				         Log.d(LOG_TAG,"Ошибка Json Parse: "+e1.toString());
	  			    }
	  			
	  		}


А может Json быть сложным

{
   "Status":{
      "Name":"Подтверждена",
      "Id":2
   },
   "Description":"Описание",
   "WorkCategory":{
      "Name":"Электрика",
      "Id":1
   },
   "OrderedAt":"2014-07-04T11:00:00.000Z",
   "ClientName":"ФИО",
   "ClientAddress":"Адрес",
   "ClientPhone":"89651101010",
   "ServiceComment":"Ваш комментарий",
   "City":{
      "Name":"Москва",
      "Id":1
   },
   "Title":"Название заявки"
}


Тогда надо делать так:
if(result != null){
	  

	  try{
      
	  	        JSONObject jObject = new JSONObject(result);
                        JSONArray myValue = jObject.getJSONArray("value");
	  				

	  				
	  				
	  		for (int i = 0; i < myValue.length(); i++) {
                        JSONObject c = myValue.getJSONObject(i);
                         
                        //Категория работ
                        JSONObject WorkCategoryObj = c.getJSONObject("WorkCategory");
                        String WorkCategory =WorkCategoryObj.getString("Name");
                        
                        //Город
                        JSONObject CityObj = c.getJSONObject("City");
                        String City =CityObj.getString("Name");
                        
                        //Статус
                        JSONObject StatusObj = c.getJSONObject("Status");
                        String Status =StatusObj.getString("Name");
                        
                        //Содержимое заявки
                        String Id = c.getString("Id");
                        String Num = c.getString("Num");
                        String Title = c.getString("Title");
                        String Description = c.getString("Description");
                        String CreatedAt = c.getString("CreatedAt");
                        String ArrivedAt = c.getString("ArrivedAt");
                        String OrderedAt = c.getString("OrderedAt");
                        String CompletedAt = c.getString("CompletedAt");
                        String ServiceComment = c.getString("ServiceComment");
                        String WorkerComment = c.getString("WorkerComment");
                        String ClientName = c.getString("ClientName");
                        String ClientAddress = c.getString("ClientAddress");
                        String ClientPhone = c.getString("ClientPhone");
                        String ClientComment = c.getString("ClientComment");
                        

	  				}
	  				
	  				
	  		
 			    }
	  			catch(JSONException e1){
				         Log.d(LOG_TAG,"Ошибка Json Parse: "+e1.toString());
			    }
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
mbelskiy
@mbelskiy
Software Developer
Есть шикарная библиотека Gson, советую ознакомиться
Ответ написан
Комментировать
vlad20012
@vlad20012
e.getMessage() не дает никакой информации о возникшем исключении, нужно строкой ниже писать e.printStackTrace(); Дополните вопрос тем, что было выписано в консоль после этого, а то скиллом телепатического поиска ошибок тут мало кто владеет.
Ответ написан
@Calc
Как уже посоветовали используйте Gson и забудьте
https://code.google.com/p/google-gson/
Gson gson = new Gson();

Response response = gson.fromJson(json, Response.class);

Response - ваш класс с полями, которые вам нужны и совпадают со строкой json
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы