![](/img/trans.png)
[英]deserialize Json tree to objects in Java for structure of android app
[英]How to modify Json structure in java (Android App)?
我正在開發一個使用Json API數據的Android應用程序。 該Json API返回的對象數組如下所示:
[
{
"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;
}
}
創建一個包含價格圖的“產品”對象。 在您的JSON響應上進行迭代並使用以下邏輯:
如果產品不存在,請創建產品並應用價格。 如果確實存在,並且價格ID也存在,則覆蓋價格。 如果價格確實存在並且價格ID不存在,則將價格添加到地圖中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.