[Java] JSON uit een ASP.NET service parsen met Gson

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 09-09 10:50
Hoi,

Ik heb een ASP.NET Webservice (.asmx file) op mijn webserver geplaatst die een bepaalde JSON string terug geeft. In Java (Android app) heb ik vervolgens wat code die deze webservice aanroept en de JSON string terug geeft.

De JSON die ik in de webservice genereer en die ik dus terug verwacht ziet er zo uit:
code:
1
{"id":9,"username":"testuser"}

Dit stelt 1 enkele User voor met een Id en Username.

Dit probeer ik met Gson vervolgens naar een User object te parsen:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
public class User
{
    public int id;
    public String username;

    public static User fromJson(String json)
    {
        Gson gson = new Gson();
        User u = gson.fromJson(json, User.class);
        return u;
    }
}


In mijn Android app krijg ik echter dit json object in een "d" object genest:
code:
1
{"d":"{"id":9,"username":"testuser"}"}


Voor zover ik kan vinden doet ASP.NET dit automatisch om exploits te voorkomen.

Ok, allemaal leuk en aardig, maar hoe kan ik dit nou mbv Gson parsen? Mijn code werkt nu natuurlijk niet, omdat dit het eerste formaat verwacht (zonder die 'd') maar dat nooit zal krijgen.


Ik heb geprobeerd de json naar een nieuw 'UserDataModel' object te parsen, die een enkele property 'd' heeft van type User:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class User
{   
    public int id;
    public String username;
    
    public static User fromJson(String json)
    {
        Gson gson = new Gson();
        UserDataModel data = gson.fromJson(json, UserDataModel.class);
        return data.d;
    }   
    
    private class UserDataModel
    {
        public User d;
    }
}

In plaats van meteen naar een User te parsen, parse ik dus nu naar een "tussen object" (UserDataModel) met die property 'd', die op zijn beurt de User bevat. Ik heb weinig ervaring met Json, maar dit data model lijkt me correct en matched de json die ik krijg, toch?

Dit werkt echter niet. Ik krijg in de 'gson.fromJson' call de volgende error:
code:
1
com.google.gson.JsonParseException: Expecting object found: "{\"id\":9,\"username\":\"testuser\"}"

Nu is die 'd' opeens weer weg..?! Ik snap het even niet meer...

Wat doe ik fout? Hoe haal ik het object dat ik wil uit die 'd' object dat .NET er automatisch aan toevoegt? Als die 'd' inderdaad altijd aanwezig zal zijn (om exploits te voorkomen) dan moet er toch ook wel iets ingebouwd zijn om die bij het parsen weer te negeren? Dat kan ik echter niet vinden. Het is ook lastig googlen als je keyword een enkele letter 'd' is 8)7

Kan iemand hierbij helpen? Ik heb het gevoel dat ik heel dichtbij ben maar zo gaat het niet werken :-(

Mijn iRacing profiel


Acties:
  • 0 Henk 'm!

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 09-09 10:50
Ok, ik keek er totaal overheen, maar ik zat te liegen. Ik krijg namelijk om de een of andere reden een json string terug waarvan de quotes escaped zijn (zoals in m'n error message te zien is):
code:
1
{"d":"{\"id\":9,\"username\":\"testuser\"}"}


Ik heb werkelijk geen idee waarom, maar goed, ik 'unescape' de zooi nu door alle \" met " te vervangen, en nu ziet de json er wel goed uit.
code:
1
{"d":"{"id":9,"username":"testuser"}"}


Het werkt echter nog steeds niet, nu krijg ik een JsonParseException, hij zegt dat de syntax fout is. Ik zie er echter niets fout aan... Wie wel?

Mijn iRacing profiel


Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 22:33
Objecten in objecten horen niet met aanhalingstekens omringd te zijn.

JSON:
1
{"d":{"id":9,"username":"testuser"}}

zou correct moeten zijn. Zie daarvoor ook de JSON pagina op Wikipedia.

Acties:
  • 0 Henk 'm!

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 09-09 10:50
Je hebt gelijk.... Maar nu vind ik het nog vreemder. Waarom staan die quotes er dan? Ik zet ze er niet zelf neer, dat hele 'd' object komt er vanzelf bij... M'n webservice geeft gewoon de correcte string terug voor zover ik kan zien...

Mijn iRacing profiel


Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 22:33
Omdat er misschien een bug in jouw webservice of in de bron zit? Geen idee om eerlijk te zijn. Eventueel een string replace doen op "{" naar {" en met het sluithaakje ook natuurlijk.

Acties:
  • 0 Henk 'm!

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 09-09 10:50
Ik denk dat ik er achter ben... De methods in mijn webservice returnen namelijk strings. Volgens mij worden die strings daarna naar Json omgezet, en daar gaat het mis. Dat hoeft namelijk niet, want de strings zijn al valid json. Ik lees nu net dat ik mijn objecten in de webservice helemaal niet zelf naar json hoef te converteren, dat gebeurt gewoon vanzelf blijkbaar... Ik ga het proberen!

Edit
Dat was het inderdaad! Als ik .net zelf de json laat genereren dan gaat het gewoon goed :) Moest er wel een klasse voor aanmaken die dezelfde property namen heeft als mijn klasse in Java, om de 'mapping' op elkaar te laten aansluiten, dat is niet heel handig ivm eventuele veranderingen later, maar het werkt nu in ieder geval wel :)

Bedankt voor je antwoord, daardoor kwam ik erachter dat mijn json inderdaad fout was en waarom :)

[ Voor 36% gewijzigd door NickThissen op 02-11-2011 23:57 ]

Mijn iRacing profiel


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Crap; ik ben nu mooi laat maar inderdaad: niet gaan rommelen met un-escapen/replacen van die dingen. Het returnede object bevat gewoon 1 property "d" met de value "<stringmeukhier>".

Dit was de dead giveaway:

{"d":"{\"id\":9,\"username\":\"testuser\"}"}

Los van 't feit dat er dus quotes escaped werden; dat gebeurt natuurlijk alleen als er iets te escapen zou zijn (lees: binnen een string value) ;)

[ Voor 3% gewijzigd door RobIII op 03-11-2011 00:03 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 09-09 10:50
Mooi, het is me nu in ieder geval een beetje duidelijk waarom het mis ging en ik heb het op kunnen lossen :)
Zit nu weer met een vergelijkbaar probleem (denk ik) dat een datum/tijd veld (DateTime in mijn .NET class) op een rare manier (die Gson niet kan parsen) in de json komt, iets met "/\Date(getal)" ofzo... Ik twijfel of het met dit probleem te maken heeft. Maar daar ga ik morgen eerst maar eens zelf naar zoeken.

Bedankt voor de hulp beiden :)

Mijn iRacing profiel

Pagina: 1