2017-09-26 47 views
0

我正在開發一個Android應用程序,它使用Json API中的數據。這Json的API返回一個對象像這樣的數組:如何修改java中的Json結構(Android App)?

[ 
    { 
    "idProduct": 1, 
    "price": 25.9, 
    "tpPrice": v1 
    }, 
    { 
    "idProduct": 1, 
    "price": 29.9, 
    "tpPrice": v2 
    }, 
    { 
    "idProduct": 2, 
    "price": 19.9, 
    "tpPrice": v1 
    }, 
    {...} 
] 

正如你所看到的,API返回具有相同ID的兩個對象,但有不同的價格。

我想實現一個解決方案,我可以修改這個JSON來是這樣的:

[ 
    { 
    "idProduct": 1, 
    "prices": [ 
     { 
     "price": "25.9, 
     "tpPrice": v1 
     }, 
     { 
     "price": "29.9, 
     "tpPrice": v2 
     } 
    ] 
    }, 
    { 
    "idProduct": 2, 
    "prices" [ 
     { 
     "price": "19.9, 
     "tpPrice": v1 
     } 
    ] 
    }, 
    {...} 
] 

那我WebServiceManager如果有必要,我使用GSON。

public class WebServiceManager extends AsyncTask<String, String, List<Object>> { 

    private IWebServiceManager iWebServiceMngr; 

    private Context ctx; 
    private ProgressDialog progress; 
    private String messageError = null; 
    private String bean = null; 
    //private final String URL = "http://192.168.7.1:8080/WSPrePedidos/api/consulta/"; 
    private final String URL_BASE = "/WSPrePedidos/api/consulta/"; 
    private final String PATH = "br.com.example.model."; 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

     progress = new ProgressDialog(ctx); 
     progress.setCancelable(false); 
     progress.setMessage(ctx.getString(R.string.progress_start)); 
     progress.show(); 
    } 

    /** 
    * 0 - Access 
    * 1 - Parameters 
    * 2 - Class 
    * 
    * @param params 
    * @return 
    */ 
    @Override 
    protected List<Object> doInBackground(String... params) { 

     bean = params[2].toString(); 
     publishProgress(ctx.getString(R.string.progress_middle)); 

     HttpURLConnection urlConnection = null; 
     BufferedReader reader = null; 
     List<Object> lstObj = new ArrayList<>(); 
     try { 
      URL url = new URL(params[0] + URL_BASE + params[1]); 
      Log.i("URL: ", url.toString()); 
      urlConnection = (HttpURLConnection) url.openConnection(); 
      urlConnection.setRequestMethod("GET"); 
      urlConnection.setConnectTimeout(50000); 
      urlConnection.setReadTimeout(50000); 
      urlConnection.connect(); 

      int cdResposta = urlConnection.getResponseCode(); 

      InputStream inputStream; 
      if (cdResposta < HttpURLConnection.HTTP_BAD_REQUEST) { 
       Log.i("InputStream Ok: ", "" + cdResposta); 
       inputStream = urlConnection.getInputStream(); 
      } else { 
       Log.i("InputStream ferrado: ", "" + cdResposta); 
       inputStream = urlConnection.getErrorStream(); 
       messageError = ctx.getString(R.string.message_fail_generic); 
      } 

      reader = new BufferedReader(new InputStreamReader(inputStream)); 

      JsonElement je = new JsonParser().parse(reader); 
      Gson gson = new Gson(); 
      if (!je.isJsonObject()) { 
       for (JsonElement element : je.getAsJsonArray()) { 
        lstObj.add(gson.fromJson(element.getAsJsonObject(), Class.forName(PATH + bean))); 
       } 
      } else if (je.isJsonObject()) { 
       messageError = null; 
       JsonObject jsonObject = je.getAsJsonObject(); 
       if (jsonObject.get("error") == null) { 
        lstObj.add(gson.fromJson(je.getAsJsonObject(), Class.forName(PATH + bean))); 
       } 
      } 


     } catch (Exception e) { 
      e.printStackTrace(); 
      messageError = ctx.getString(R.string.message_fail_connect_server); 
     } finally { 
      try { 
       if (urlConnection != null) 
        urlConnection.disconnect(); 
       if (reader != null) 
        reader.close(); 
      } catch (IOException e1) { 
       //e1.printStackTrace(); 
      } 
     } 

     return lstObj; 
    } 

    @Override 
    protected void onProgressUpdate(String... params) { 
     progress.setMessage(params[0]); 
    } 

    @Override 
    protected void onPostExecute(List<Object> lstObj) { 
     super.onPostExecute(lstObj); 

     iWebServiceMngr.posExecuteAsyncTaskResult(lstObj, bean, messageError); 
     progress.dismiss(); 
    } 

    public WebServiceManager(Context ctx, IWebServiceManager iWebServiceMngr) { 
     this.ctx = ctx; 
     this.iWebServiceMngr = iWebServiceMngr; 
    } 
} 
  • 對不起我的英語不好。
  • 我試圖儘可能具體。

回答

1

創建一個包含價格圖的「產品」對象。在您的JSON響應中迭代並使用邏輯:

如果產品不存在,請創建產品並應用價格。 如果它確實存在且價格ID也會覆蓋價格。 如果確實存在且價格ID不存在,請將價格添加到地圖。