Bug di generazione JSON di Android 4: Posso utilizzare una versione più recente della libreria org.JSON rispetto a quella in dotazione?

Ho un'applicazione Android che in alcuni luoghi genera JSON, lo serializza, e poi in un secondo tempo lo de-serializza e utilizza i dati. Sto utilizzando il built-in JSONObject su Android 5 e su che guarda il pacchetto org.json.

La mia applicazione funziona bene su tutti i dispositivi Android 5.0 e nuovi, ma su Android 4.x non riesce in alcuni luoghi. Guardando nel debugger il JSONObject de-serializzato sembra un po 'rotto.

  • Estendere tutte le attività da un'attività comune non funziona
  • Impostazione dell'image di background in java
  • Come visualizzare i valori max e min su un SeekBar?
  • Come faccio a prendere un'istantanea dello stato dell'emulatore Android?
  • memorizzare e recuperare un object di class nella preferenza condivisa
  • C'è un modo per passare un arraysbuffer da javascript a java su Android?
  • Questo sembra un tipo di bug nella libreria JSON che viene fornita con i vecchi androidi e vorrei semplicemente utilizzare una versione aggiornata di MavenCentral o JCenter

    Come faccio a fare questo? ho aggiunto

    compile 'org.json:json:20160212' 

    Nella sezione delle dependencies build.gradle della mia applicazione, ma non sembra fare alcuna differenza.

    È ansible o la vittoria della vecchia biblioteca del sistema Android andato?


    Aggiornamento: risulta non essere un bug nell'analisi JSON, ma nella generazione di JSON. L'applicazione stava generando JSON da oggetti Java Map e List – che in Android 4 provoca un'output di stringhe non corrette: Maggiori informazioni qui: http://fupeg.blogspot.co.nz/2011/07/android-json-bug.html

    Ho lavorato intorno al problema scrivendo le seguenti due funzioni:

     public static JSONObject mapToJSON(Map<String,Object> map){ HashMap<String,Object> fixed = new HashMap<>(); for (String key : map.keySet()){ Object value = map.get(key); if (value instanceof Map){ value = mapToJSON((Map<String,Object>) value); } else if (value instanceof List) { value = listToJSON((List<Object>)value); } fixed.put(key,value); } return new JSONObject(fixed); } public static JSONArray listToJSON(List<Object> list) { JSONArray result = new JSONArray(); for (Object value : list){ if (value instanceof Map){ value = mapToJSON((Map<String,Object>) value); } else if (value instanceof List) { value = listToJSON((List<Object>)value); } result.put(value); } return result; } 

    E sostituendo tutte le chiamate nell'app

    • new JSONObject(someList) sostituito con listToJSON(someList)
    • new JSONObject(someMap) sostituito con mapToJSON(someMap)

    La questione rimane però ancora. Sarebbe molto meglio se non fossi necessario implementare questa soluzione e potrebbe invece mettere insieme una versione più recente della libreria di org.json da utilizzare in Android 4.0. Qualcuno sa come posso fare questo su Android? O se non è ansible?

  • Che cosa significa "Questo metodo è deprecato" significa per gli sviluppatori di applicazioni
  • Come applicare un grande stile di visualizzazione a una notifica utilizzando la libreria di Parse
  • La soluzione esatta del "Get Phone Number in Android"
  • Android SupportActionBar non aggiorna il titolo
  • get eccezioni "IllegalStateException: imansible eseguire questa azione dopo onSaveInstanceState"
  • android ottiene bitmap o suono dai beni
  • L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.