Forumdelen sponsras av

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

Trädvy Permalänk
Medlem
Plats
Gävle
Registrerad
Sep 2005

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 } ] } ], }

Trädvy Permalänk
Medlem
Plats
Skåne
Registrerad
Jan 2011

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

Stationär:Asrock P67 Extreme 4 | i5 2500K@4,5Ghz | Asus GTX 970 black | 2x Intel 520 180gb, 2x WD blue 5tb | 8GB Corsair XMS3 + 8GB Hyper x Fury | EVGA Supernova G2 750W Gold | Silverstone FT02
Laptop: Jumper ezbook 3 pro
Mobil: Xiaomi Redmi Note 3 pro SE

Trädvy Permalänk
Medlem
Plats
Örebro
Registrerad
Jul 2006

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

ex:

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

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Feb 2012

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

något sånt

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

Trädvy Permalänk
Medlem
Plats
Gävle
Registrerad
Sep 2005

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.

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Nov 2009

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å

Trädvy Permalänk
Medlem
Plats
Sverige
Registrerad
Jul 2001

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.

WS: AMD Ryzen 7 1700 | 16 GB DDR4 | Geforce GTX 1060 OC 6GB | 480 + 256 + 240 + 240 GB SSD | Win10 x64 Professional + Antergos Linux (Arch-derivat)
Bärbar: Macbook Pro Retina 13" | Intel Core I5 2,4Ghz | 16GB RAM | 256GB Flash
Server: 3x HP Proliant microserver Gen8 | 16 GB DDR3 ECC ram | Sammanlagt 26TB HDD | Esxi

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Okt 2011
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

Chassi: Fractal Design Define XL Moddat för vattenkylning för CPU och GPU Radiatorer: 280mm och 140mm Moderkort: Asus ROG Maxiumus VI Hero RAM: 16GB @ 2Ghz GPU: AMD 7970 3GB Refrence @ 1,2Ghz SSD: 1st Samsung EVO 500GB & 2st OCZ Agility 3 120GB RAID 0 + 2TB HDD CPU: Intel i7 4770K @ 4GHz Tangentbord: QPAD MK-85 Mus: QPAD 5K

Trädvy Permalänk
Medlem
Registrerad
Okt 2007

Prova Volley.
jsonobjectrequest
jsonarrayrequest

Ryzen 1700 @3,8Ghz 1,342V | Corsair Vengeance LPX 2x8Gb (CMK16GX4M2B3000C15) | Asus Prime x370 Pro | MSI GTX 770 2GB SLI