Java/Android hur kommer jag åt data i ett nästat JSON Array/Object?

Permalänk

Java/Android hur kommer jag åt data i ett nästat JSON Array/Object?

Jag är ganska ny på android/java och undrar hur jag gör för att komma å data i en JSON som består av flera nästade Arrays/Objekt?
Hur gör jag exempelvis för att komma åt "age" ?

{ "images": [ { "status": "Complete", "width": 475, "height": 475, "file": "content_5a28298675c96", "faces": [ { "topLeftX": 109, "topLeftY": 107, "height": 241, "rightEyeCenterY": 167, "rightEyeCenterX": 179, "pitch": -11, "quality": 0.75184, "confidence": 0.99938, "chinTipX": 229, "yaw": -5, "chinTipY": 369, "eyeDistance": 109, "width": 241, "leftEyeCenterY": 167, "leftEyeCenterX": 288, "attributes": { "lips": "Apart", "asian": 0.00006, "gender": { "femaleConfidence": 0.00001, "type": "M", "maleConfidence": 0.99999 }, "age": 34, "hispanic": 0.00023, "other": 0.00034, "black": 0.99936, "white": 0, "glasses": "Eye" }, "face_id": 1, "roll": 1 } ] } ], }

Permalänk
Medlem

Är ingen Android expert men principen borde vara i form av nästlade objekt/arrayer. Använder du något JSON bibliotek?

Permalänk
Medlem

Kolla på https://github.com/google/gson

ex:

MyClass my = new Gson().fromJson(jsonStr, MyClass.class)

Permalänk
Medlem

JSONObject json = new JsonObject(jsonStr); json.getJSONArray("images").getJSONObject(0) .getJSONArray("faces").getJSONObject(0) .getString("age");

något sånt

Visa signatur

2500k @ 4Ghz - H80 | GTX 970 DCII | 8 GB ram
Qpad MK-50, Qpad 5k, Qpad QH-85, Qck+
voff | voff voff

Permalänk

Ok får nog erkänna att jag inte riktigt förstår hur jag ska få till det, men jag ska trassla vidare och se om jag får till det senare. Men en fundering, för att testa json parsningen så har jag helt enkelt kopierat/klistrat in json svaret i en String för att öva mot den. Men android studio lägger till en massa " " " samt "\n" automatisk för att matcha formateringen antar jag. Kan detta ställa till parsningen?

Mitt andra problem är att när jag ska posta till api:et så ska det se ut så här:

POST /detect HTTP/1.1 Content-Type: application/json app_id: ID app_key: KEY { "image":" http://media.kairos.com/kairos-elizabeth.jpg ", "selector":"ROLL" }

Hur gör jag lättast för att post:a? och är det möjligt på något sätt att konvertera en lokal fil på telefonen till ett url? eller måste jag ladda upp filen via någon tjänst för att få ett URL? Jag vill altså skicka med en bild från telefonen i posten. Jag exprementerade lite med:
Uri.fromFile(new File("/storage/emulated/0/Download/aaa.jpg")) och jag fick bilden att visas i en ImageView men har ingen aning om det är möjligt att använda samma grej i post:en med.

Permalänk
Medlem

Vill du göra allt för hand för inlärnings skull?

Är ju ganska populärt att använda Retrofit & Okhttp för interaktion med ett REST API samt någon JSON parser, ex Gson eller moshi.

Då kan det exempelvis se ut såhär med Retrofit & Moshi: (plockat bort massa kod, blir lite luddigt eftersom allt ligger i olika klasser)

// Användaren har matat in någon text och klickat på sök, anropat interactorn att söka efter texten //Interactor fun searchForLocation(searchTerm : String){ searchUsecase.searchForLocation(searchTerm.trim(), object : Observer<VtResponseModel> { override fun onNext(response: VtResponseModel) { .... etc etc etc ett resultat här performViewAction { setSearchResult((result) } } override fun onError(e: Throwable) = performViewAction { showMessage(e.toString()) } ..... }) // I Repository override fun getLocationBySearch(searchTerm : String): Observable<VtResponseModel> { return checkValidToken().flatMap { token -> service.getLocationByInput(formatTokenString(token) ,searchTerm) } } // Retrofit Service @GET("location.name") fun getLocationByInput( @Header("Authorization") tokenTypeAccessToken: String, @Query("input") input: String, @Query("format") json: String = "json" ): Observable<VtResponseModel>

en POST ser exempelvis ut såhär

@FormUrlEncoded @Headers("Content-Type: application/x-www-form-urlencoded", "Authorization:" + etcetcetc) @POST fun getAccessToken(@Url url : String, @Field("grant_type") client_credentials: String, @Field("scope") scopeId: String ): Observable<AccessToken>

Retrofit + Okhttp sköter dina HTTP Requests och Moshi/Gson parsar json responsen till en modell som du har definierat.
Var typ ett år sedan jag rörde detta så finns säkert bättre sätt att göra det på

Permalänk
Medlem

Använd en ObjectMapper från Jackson FasterXML
Använder du Maven? (Om inte, börja med det eller gradle)
Här har du iaf maven-dependencyt för jackson-core som omvandlar JSON till en vanlig java-klass.
Bara att skapa en klass som matchar JSON-strukturen så sköter biblioteket resten.

https://mvnrepository.com/artifact/com.fasterxml.jackson.core...

Edit: Såg inte att det var android du grejade med, men kanske funkar där med.

Visa signatur

WS: Mac Studio M1 Max | 32 GB | 1TB | Mac OS
WS: Intel i5 12600K | 64 GB DDR4 @3600 Mhz | 2x1TB nvme 2x1TB SSD SATA | Windows 11 & Manjaro Linux
Bärbar: Macbook Pro 14" | M1 Pro | 16GB RAM | 512GB SSD | Mac OS
Servrar: Intel i7 10700K | 64 GB DDR4 @3600Mhz | 3 TB SSD + 22TB HDD | Unraid |
4x Raspberry pi 4b 8Gb | Dietpi |

Permalänk
Medlem
Skrivet av burton666:

Jag är ganska ny på android/java och undrar hur jag gör för att komma å data i en JSON som består av flera nästade Arrays/Objekt?
Hur gör jag exempelvis för att komma åt "age" ?

{ "images": [ { "status": "Complete", "width": 475, "height": 475, "file": "content_5a28298675c96", "faces": [ { "topLeftX": 109, "topLeftY": 107, "height": 241, "rightEyeCenterY": 167, "rightEyeCenterX": 179, "pitch": -11, "quality": 0.75184, "confidence": 0.99938, "chinTipX": 229, "yaw": -5, "chinTipY": 369, "eyeDistance": 109, "width": 241, "leftEyeCenterY": 167, "leftEyeCenterX": 288, "attributes": { "lips": "Apart", "asian": 0.00006, "gender": { "femaleConfidence": 0.00001, "type": "M", "maleConfidence": 0.99999 }, "age": 34, "hispanic": 0.00023, "other": 0.00034, "black": 0.99936, "white": 0, "glasses": "Eye" }, "face_id": 1, "roll": 1 } ] } ], }

Ta en titt på Bridge det är ett enklare nätverks bibliotek. https://github.com/afollestad/bridge

Visa signatur

The honey badger doesn't care.

Permalänk
Medlem

Prova Volley.
jsonobjectrequest
jsonarrayrequest

Visa signatur

Ryzen 1700 @3,8Ghz 1,342V | Corsair Vengeance LPX 2x8Gb (CMK16GX4M2B3000C15) | Asus Prime x370 Pro | KFA2 GTX 1080 Ti