2015-02-16 3 views
1

Я хочу проанализировать следующий файл JSON, но начинает с [, указывая мне, что является массивом, а затем продолжает объекты {, мой текущий синтаксический анализатор возвращает объект JSON.как разобрать json-файл при запуске с

Мой вопрос: как изменить парсер для анализа этого файла? Таким образом, синтаксический анализатор будет обслуживать меня для других файлов JSON, начиная с объектов или аранжировок.

JSON FILE:

[{"codigo":1,"contenido":[{"codigo":1,"descripcion":"Lomo completo"},{"codigo":2,"descripcion":"Cerveza 1 Lt."}],"descripcion":"1 lomo completo y 1 cerveza de lt","precio":100.0},{"codigo":2,"contenido":[{"codigo":1,"descripcion":"Lomo completo"},{"codigo":2,"descripcion":"Cerveza 1 Lt."}],"descripcion":"2 lomo completo y 2 cerveza de lt","precio":190.0},{"codigo":3,"contenido":[{"codigo":1,"descripcion":"Lomo completo"},{"codigo":2,"descripcion":"Cerveza 1 Lt."}],"descripcion":"3 lomo completo y 3 cerveza de lt","precio":280.0},{"codigo":4,"contenido":[{"codigo":1,"descripcion":"Lomo completo"},{"codigo":2,"descripcion":"Cerveza 1 Lt."}],"descripcion":"4 lomo completo y 4 cerveza de lt","precio":370.0}] 

JSON PARSER

public class JSONParser { 
static InputStream is = null; 
    static JSONObject jObj = null; 
    static String json = ""; 

    // constructor 
    public JSONParser() {} 

    public JSONObject getJSONFromUrl(String url) { 

     // Making HTTP request 
     try { 
      // defaultHttpClient 
      DefaultHttpClient httpClient = new DefaultHttpClient(); 
      HttpPost httpPost = new HttpPost(url); 

      HttpResponse httpResponse = httpClient.execute(httpPost); 
      HttpEntity httpEntity = httpResponse.getEntity(); 
      is = httpEntity.getContent(); 

     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } catch (ClientProtocolException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     try { 
      BufferedReader reader = new BufferedReader(new InputStreamReader(
        is, "iso-8859-1"), 8); 
      StringBuilder sb = new StringBuilder(); 
      String line = null; 
      while ((line = reader.readLine()) != null) { 
       sb.append(line + "\n"); 
      } 
      is.close(); 
      json = sb.toString(); 
     } catch (Exception e) { 
      Log.e("Buffer Error", "Error converting result " + e.toString()); 
     } 

     // try parse the string to a JSON object 
     try { 
      jObj = new JSONObject(json); 
     } catch (JSONException e) { 
      Log.e("JSON Parser", "Error parsing data " + e.toString()); 
     } 

     // return JSON String 
     return jObj; 
    } 
} 

Попробуйте парсера JSON ФАЙЛ

public class OfertaService extends Service { 

private static final String URL = "http://192.168.0.13:8080/ofertas/listado"; 
private static final String TAG_CODIGO = "codigo"; 
private static final String TAG_CONTENIDO = "contenido"; 
private static final String TAG_DESCRIPCION = "descripcion"; 
private static final String TAG_PRECIO = "precio"; 

private static final String TAG_CODIGO_PRODUCTO = "codigo"; 
private static final String TAG_DESCRIPCION_PRODUCTO = "descripcion"; 

@SuppressWarnings("rawtypes") 
private List listaOfertas = new ArrayList(); 

public List getListaOfertas() { 
    return listaOfertas; 
} 

public void setListaOfertas(List listaOfertas) { 
    this.listaOfertas = listaOfertas; 
} 

@Override 
public IBinder onBind(Intent intent) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@SuppressWarnings("unchecked") 
@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    try { 
     new DoInBack().execute(); 
    } catch (Exception e) { 
     System.out.println("error en proceso de segundo plano DoInBack"); 
    } 
    return 0; 
} 

@Override 
public void onDestroy() { 
    // TODO Auto-generated method stub 
    super.onDestroy(); 
} 

private class DoInBack extends AsyncTask<String, String, String> { 

    @Override 
    protected String doInBackground(String... params) { 
     JSONParser jParser = new JSONParser(); 
     JSONArray ofertasArray = null; 
     JSONArray productos = null; 
     JSONObject json = jParser.getJSONFromUrl(URL); 
     try { 
      String codigo = json.getString(TAG_CODIGO); 
      for (int i = 0; i < ofertasArray.length(); i++) { 
       JSONObject of; 
       of = ofertasArray.getJSONObject(i); 

       String id = of.getString(TAG_CODIGO); 
     //  productos = json.getJSONArray(0); 
       List listaProductos = new ArrayList(); 
       for (int j = 0; j < productos.length(); j++) { 
        JSONObject pro = productos.getJSONObject(j); 
        String idProducto = pro.getString(TAG_CODIGO_PRODUCTO); 
        String descProducto = pro 
          .getString(TAG_DESCRIPCION_PRODUCTO); 

        Hashtable<String, String> producto = new Hashtable<String, String>(); 
        producto.put(TAG_CODIGO_PRODUCTO, idProducto); 
        producto.put(TAG_DESCRIPCION_PRODUCTO, descProducto); 

        listaProductos.add(producto); 
       } 

       String descripcionOferta = of.getString(TAG_DESCRIPCION); 
       String precio = of.getString("precio"); 
       Hashtable ht = new Hashtable(); 
       ht.put(TAG_CODIGO, id); 
       ht.put(TAG_CONTENIDO, listaProductos); 
       ht.put(TAG_DESCRIPCION, descripcionOferta); 
       ht.put(TAG_PRECIO, precio); 

       listaOfertas.add(ht); 
      } 
      System.out.println("parseo finalizado"); 

     } catch (Exception e) { 

     } 

     return null; 
    } 
} 
+0

Сделайте себе одолжение и замените большую часть вашего метода 'getJSONFromUrl()' на 'String json = EntityUtils.toString (httpResponse.getEntity());', см. Http://developer.android.com/reference/org /apache/http/util/EntityUtils.html#toString(org.apache.http.HttpEntity) –

+0

с 'EntityUtils' ваш класс' JSONParser' может выглядеть следующим образом: http://pastebin.com/HwLE0kLr –

+0

@PhilippReichart благодарит за ответ, я буду проверять изменения :) – santiago92

ответ

5

Я хочу разобрать следующий файл JSON, но, начиная с [ , указывающего мне, что это массив

Когда JSON строка, начинающаяся с [ означает строка JSONArray

как изменить анализатор проанализировать этот файл?

1. Преобразование json строки в JSONArray вместо JSONObject:

JSONArray jsonArray = new JSONArray(json); 

2. Изменить тип возвращаемого getJSONFromUrl метода к JSONArray от JSONObject

3. В doInBackground получить ответ от getJSONFromUrl метод JSONArray:

JSONArray jsonArray = jParser.getJSONFromUrl(URL); 
+0

спасибо за ответ, я проверю изменения, а затем вы прокомментировали :) – santiago92

+0

@ santiago92: хорошо протестируйте его и сообщите мне, если возникли проблемы –

+0

Спасибо, он работал отлично. С наилучшими пожеланиями – santiago92

0

использование org.codehaus.jackson файл банка и прочитать файл или URL-адрес или байты п число способов есть, чтобы прочитать данные JSON. ObjectMapper mapper = new ObjectMapper(); mapper.readValue (ваш файл, класс модели)

sample reading json data или вы можете выбрать readValue() в соответствии с вашими требованиями.

+0

спасибо за ответ, я проверю ваш код :) – santiago92

Смежные вопросы