Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [Android] Costruire un JSON complesso

    ciao!

    in una app android devo costruire e riempire da db locale un json con questa struttura:
    codice:
    {
      "accessLogs": [
        {
          "uuid": "",
          "accessType": "",
          "userId": 0,
          "loggedOn": "2019-11-12T09:04:22.925Z",
          "hospitalUnitId": 0,
          "workPlanTypeId": 0,
          "imei": ""
        }
      ],
      "receipts": [
        {
          "uuid": "",
          "userId": 0,
          "imei": "",
          "hospitalUnitId": 0,
          "workPlanTypeId": 0,
          "code": "",
          "number": "",
          "createdOn": "2019-11-12T09:04:22Z",
          "reports": [
            {
              "uuid": "",
              "roomId": 0,
              "reportedOn": "2019-11-12T09:04:22Z",
              "userId": 0,
              "imei": "",
              "ok": false,
              "issueTypes": [
                {
                  "id": 0
                }
              ],
              "issueDescription": ""
            }
          ]
        }
      ]
    }
    al momento sto procedendo "a mano" con StringBuilder:
    codice:
    StringBuilder json = new StringBuilder();
    json.append("{");
    
    json.append("'accessLogs':[");
    List<AccessLogs> al = dataSource.accessLogsDao.selectAll();
    for (AccessLogs obj : al) {
        json.append("{");
        json.append("'uuid':").append(obj.uuid);
        json.append("'accessType':").append(obj.accessType);
        json.append("'userId':").append(obj.userId);
        json.append("'loggedOn':").append(obj.loggedOn);
        json.append("'hospitalUnitId':").append(obj.hospitalUnitId);
        json.append("'workPlanTypeId':").append(obj.workPlanTypeId);
        json.append("'imei':").append(obj.imei);
        json.append("},");
    }
    json.append("]");
    
    json.append("}");
    
    Log.e("JSON", json.toString());
    ma non mi pare la soluzione migliore.
    questi dati li devo poi spedire ad una API, e per farlo uso Volley.
    qualche suggerimento??

  2. #2
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Per gli Spartani e Sparta usa spartan Il mio github

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da fermat Visualizza il messaggio
    al momento sto procedendo "a mano" con StringBuilder:
    No, generalmente non si compone un JSON "a mano" così. Ti tiri addosso un sacco (ma proprio un sacco ...) di grane. Devi farlo in maniera molto attenta e accurata, non ti devi dimenticare es. gli apici (errore che invece hai già fatto, emetti i valori string senza gli apici doppi!) o altro, devi fare l'escape dei caratteri speciali (se un tuo oggetto contiene una stringa con dentro " sballi tutto) e se volessi indentare o non indentare il JSON in maniera configurabile, non lo fai facilmente.

    Si usano delle apposite librerie per la lettura/scrittura di JSON. Poi puoi vedere se usare una API "programmatica" oppure una API che fornisce un "binding" tra classi e JSON.


    P.S. secondo le specifiche https://www.json.org le stringhe (chiavi / valori string) DEVONO essere racchiuse dall'apice doppio " .. non da quello singolo '

    E hai anche dimenticato la virgola dopo una entry chiave-valore !
    Ultima modifica di andbin; 06-02-2020 a 12:14
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  4. #4
    Quote Originariamente inviata da linoma Visualizza il messaggio
    grazie mille!

    posto un esempio di codice per altri che possono avere la stessa domanda:
    codice:
    List<AccessLogs> al = dataSource.accessLogsDao.selectAll();
    JSONArray arrAcl = new JSONArray();
    for (AccessLogs obj : al) {
        JSONObject jo = new JSONObject();
        jo.put("uuid", obj.uuid);
        jo.put("accessType", obj.accessType);
        jo.put("userId", obj.userId);
        jo.put("loggedOn", obj.loggedOn);
        jo.put("hospitalUnitId", obj.hospitalUnitId);
        jo.put("workPlanTypeId", obj.workPlanTypeId);
        jo.put("imei", obj.imei);
        arrAcl.put(jo);
    }
    
    JSONArray arrRec = new JSONArray();
    List<Receipts> rl = dataSource.receiptsDao.selectByInviata(0);
    for (Receipts obj : rl) {
        JSONObject jo = new JSONObject();
        jo.put("uuid", obj.uuid);
        jo.put("userId", obj.userId);
        jo.put("imei", obj.imei);
        jo.put("hospitalUnitId", obj.hospitalUnitId);
        jo.put("workPlanTypeId", obj.workPlanTypeId);
        jo.put("code", obj.code);
        jo.put("number", obj.number);
        jo.put("createdOn", obj.createdOn);
        arrRec.put(jo);
    }
    
    JSONObject jsonObject = new JSONObject();
    jsonObject.put("accessLogs", arrAcl);
    jsonObject.put("receipts", arrRec);
    
    Log.e("JSON", jsonObject.toString());

  5. #5
    Quote Originariamente inviata da andbin Visualizza il messaggio
    No, generalmente non si compone un JSON "a mano" così. Ti tiri addosso un sacco (ma proprio un sacco ...) di grane. Devi farlo in maniera molto attenta e accurata, non ti devi dimenticare es. gli apici (errore che invece hai già fatto, emetti i valori string senza gli apici doppi!) o altro, devi fare l'escape dei caratteri speciali (se un tuo oggetto contiene una stringa con dentro " sballi tutto) e se volessi indentare o non indentare il JSON in maniera configurabile, non lo fai facilmente.

    Si usano delle apposite librerie per la lettura/scrittura di JSON. Poi puoi vedere se usare una API "programmatica" oppure una API che fornisce un "binding" tra classi e JSON.


    P.S. secondo le specifiche https://www.json.org le stringhe (chiavi / valori string) DEVONO essere racchiuse dall'apice doppio " .. non da quello singolo '

    E hai anche dimenticato la virgola dopo una entry chiave-valore !
    si grazie, nel frattempo mi ero accorto di un sacco di errori che stavo facendo.
    ecco perchè il mio dubbio.

    cmq ho risolto con l'esempio messo nell'altro post.

    grazie!

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da fermat Visualizza il messaggio
    grazie mille!
    posto un esempio di codice per altri che possono avere la stessa domanda:
    Presumo hai usato la org.json proprio di Android.
    E' molto a "basso" livello ma per quello che devi fare va bene e comunque ti toglie tutte le grane che dicevo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  7. #7
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Presumo hai usato la org.json proprio di Android.
    E' molto a "basso" livello ma per quello che devi fare va bene e comunque ti toglie tutte le grane che dicevo.
    si ho usato quella.

    solo che ho un problema che non riesco a comprendere:
    codice:
    List<AccessLogs> al = dataSource.accessLogsDao.selectAll();
    JSONArray arrAcl = new JSONArray();
    for (AccessLogs obj : al) {
        Log.e("IMEACC", obj.imei);
    
        JSONObject jo = new JSONObject();
        jo.put("uuid", obj.uuid);
        jo.put("accessType", obj.accessType);
        jo.put("userId", obj.userId);
        jo.put("loggedOn", obj.loggedOn);
        jo.put("hospitalUnitId", obj.hospitalUnitId);
        jo.put("workPlanTypeId", obj.workPlanTypeId);
        jo.put("imei", obj.imei);
        arrAcl.put(jo);
    }
    allora, dal log si vede sempre obj.ime è valorizzato.
    ma poi nel json risulta vuoto:
    codice:
    {"uuid":"26ea3fefcb8f419792becb7ef59fd4bb","accessType":"LOGIN","userId":99,"loggedOn":"2020-02-06T12:35:16Z","hospitalUnitId":0,"workPlanTypeId":0,"imei":""}
    non riesco a capire cosa gli dia fastidio.

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,303
    Strano.
    Mi viene da pensare che il campo imei sia di un tipo particolare e che quello che vedi stampato sul log sia il risultato del toString(). Se così è, devi invocare il toString() esplicitamente altrimenti lo cercherà di incapsulare come Object e potrebbe non riuscirci.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    allora, imei è un campo String di questo oggetto:
    codice:
    import com.abubusoft.kripton.android.annotation.BindIndex;
    import com.abubusoft.kripton.android.annotation.BindSqlType;
    import com.abubusoft.kripton.annotation.BindType;
    
    @BindType
    @BindSqlType(name = "AccessLogs", indexes = {
            @BindIndex(value = {"uuid"}),
            @BindIndex(value = {"userId"})
    })
    public class AccessLogs {
    
        public long id;
        public String uuid;
        public String accessType;
        public int userId;
        public String loggedOn;
        public int hospitalUnitId;
        public int workPlanTypeId;
        public String imei;
    
    }
    come si prende gli altri, dovrebbe prendersi anche quello.
    tra l'altro se glielo metto fisso così non ho problemi:
    codice:
    for (AccessLogs obj : al) {
        Log.e("IMEACC", obj.imei);
    
        JSONObject jo = new JSONObject();
        jo.put("uuid", obj.uuid);
        jo.put("accessType", obj.accessType);
        jo.put("userId", obj.userId);
        jo.put("loggedOn", obj.loggedOn);
        jo.put("hospitalUnitId", obj.hospitalUnitId);
        jo.put("workPlanTypeId", obj.workPlanTypeId);
        jo.put("imei", "CIAO");
        arrAcl.put(jo);
    }

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da fermat Visualizza il messaggio
    codice:
        Log.e("IMEACC", obj.imei);
    
        jo.put("imei", obj.imei);
    non riesco a capire cosa gli dia fastidio.
    Neanche io ... perché se il field imei è un String, non vedo per quale motivo il log dia qualcosa e il put metta "".
    Se l'oggetto AccessLogs è creato e usato solo dal thread che sta facendo quel codice, non vedo cose davvero "strane" ....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.