java - 以什么开头时如何解析json文件

标签 java android json parsing service

我想解析以下 JSON 文件,但以 [ 开始,指示我这是一个数组,然后继续 { 对象,我当前的解析器正在返回一个 JSON 对象。

我的问题是:如何修改解析器来解析这个文件?这样解析器将为我提供其他 JSON 文件,从对象或排列开始。

JSON 文件:

[{"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 解析器

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;
    }
}

最佳答案

I want to parse the following JSON file but is starting with [ indicating to me that is an array

当json字符串以[开头表示字符串为JSONArray

how to modify the parser to parse this file?

1.json字符串转换为JSONArray而不是JSONObject:

JSONArray jsonArray = new JSONArray(json);

2.getJSONFromUrl 方法的返回类型从 JSONObject 更改为 JSONArray

3.doInBackground 中从 JSONArray 中的 getJSONFromUrl 方法获取响应:

    JSONArray jsonArray = jParser.getJSONFromUrl(URL);

关于java - 以什么开头时如何解析json文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28540887/

相关文章:

c# - C# 中的协变和逆变

android - 尝试使用 gdata API 将视频上传到 YouTube 时找不到类错误

javascript - Json 数组对象访问

java - 如何关闭这个文件编写器? (Java、Bukkit)

java - 不允许用户通过更改系统日期来更新回溯日期的表

java - Android - 测试 Activity 是否引发异常

java - Android Webview 因错误而崩溃(错误 | EGL_BAD_DISPLAY)

android - 从 cookiesyncmanager 进行 Jsoup cookie 身份验证以从 https 站点抓取

javascript - 如何为 REST json 数据创建一个基本的 angularjs 页面?

java - Netty 的 HttpObjectAggregator 似乎错过了 HTTP block