Modifier la solution trouvée:
J'ai trouvé l'erreur dans mon code. J'exécute ceci sur un test unitaire et Android n'utilise pas d'objets JSON sur les tests unitaires car cela fait partie d'Android. C'est pourquoi il retournait null.
Question:
Je suis en train de reconvertir ma chaîne en un JsonObject à l'aide de JSONObject ("string")
Voici un exemple de ma chaîne:
content = "the string above"
var obj = JSONObject(content.substring(content.indexOf("{"), content.lastIndexOf("}") + 1))
System.out.println("obj1: " + obj.toString())
obj = JSONObject(content)
System.out.println("obj1: " + obj.toString())
var obj1 = JSONArray(content)
System.out.println("obj1: " + obj1.toString())
obj1 = JSONArray(content.substring(content.indexOf("{"), content.lastIndexOf("}") + 1))
System.out.println("obj2: " + obj1.toString())
Son retour de null sur mes JsonObjects:
{
"sessions": [
{
"locations": [
{
"lat": "14.2294625",
"lng": "121.1509005",
"time": 1560262643000,
"speed": 0,
"speedLimit": 0
},
{
"lat": "14.2294576",
"lng": "121.1509498",
"time": 1560262713000,
"speed": 0,
"speedLimit": 0
},
{
"lat": "14.2294576",
"lng": "121.1509498",
"time": 1560262714000,
"speed": 0,
"speedLimit": 0
}
],
"name": "1.5645220491E12"
}
]
}
Tous les les sorties de ceci sont nulles. Un moyen de savoir quelle erreur se produit pour que je puisse ajuster ma chaîne json?
3 Réponses :
sous-chaîne votre chaîne JSON. Mettez-le dans JSONObject et cela fonctionnera correctement. getJSONObject ou getJSONArray contenu dans le code (ou comment la charger) Votre code modifié
val content = "the string above" var obj = JSONObject(content)
Déjà fait cela, vous pouvez voir dans mon code que j'ai essayé de nombreuses façons différentes de le convertir en objet, tous retournent null.
Montrez comment vous chargez votre chaîne
Je lance cette fonction pour analyser votre chaîne et c'est ok. Votre chaîne est valide. Pouvez-vous spécifier comment lancer le val content
fun parseJson() {
var stringJson = "{\"sessions\": [{\"locations\": [{\"lat\": \"14.2294625\",\"lng\": \"121.1509005\",\"time\": 1560262643000,\"speed\": 0,\"speedLimit\": 0},{\"lat\": \"14.2294576\",\"lng\": \"121.1509498\",\"time\": 1560262713000,\"speed\": 0,\"speedLimit\": 0},{\"lat\": \"14.2294576\",\"lng\": \"121.1509498\",\"time\": 1560262714000,\"speed\": 0,\"speedLimit\": 0}],\"name\": \"1.5645220491E12\"} ]}"
var obj = JSONObject(stringJson)
System.out.println("obj1: $obj")
var sessionArray: JSONArray = obj.optJSONArray("sessions")
System.out.println("obj1: $sessionArray")
var firstObject = sessionArray[0]
System.out.println("obj1: $firstObject")
}
Puisque vous exécutez votre code avec Junit, il s'exécute sur le SDK de votre ordinateur. Ce SDK ne fournit pas tout, certains sont juste une classe squelette fournissant la signature de la méthode et de la documentation mais pas le code. Vous ne pouvez donc pas exécuter directement.
Essayez d'ajouter la bibliothèque dans testing
testImplementation 'org.json:json:your_version'
Voir la version ici:
http://mvnrepository.com/artifact/org.json/json
Ce est basé sur la réponse de ce message: JSONObject renvoie une valeur non nulle de "null" après instanciation avec la chaîne
Ça marche pour moi!!
il vaut peut-être mieux créer un modèle pojo et utiliser la bibliothèque Gson? Ou vous n'avez pas une telle opportunité?
Essayez d'utiliser Retroft , c'est beaucoup plus rapide et plus facile.
@SergeiMikhailovskii c'est juste un simple test unitaire lisant à partir d'un fichier texte json local. Oui, c'est possible mais je veux savoir pourquoi ce code ne fonctionne pas.