2016-12-18 2 views
-1

У меня есть ответ JSon следующего типа -GSON deserialise атрибута строки в объект

{ 
    userName:"Jon Doe", 
    country:"Australia" 
} 

Мой класс Пользователь выглядит так -

public class User{ 
    private String userName; 
    private Country country; 
} 

GSON разбор выдает следующее сообщение об ошибке:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 3 column 18 path $[0].country

Есть ли способ сообщить GSON, чтобы проанализировать страну в объекте Country с моим текущим JS В ответ?

+0

[попытался это?] (Http://stackoverflow.com/a/18483355/1398531) –

+0

Что такое страна? Класс или перечисление? – roby

+0

@roby Country - это класс. –

ответ

1

Вы можете добиться этого, зарегистрировав собственный десериализатор.

public static class Country { 
    private String name; 

    public Country(String name) { 
     this.name = name; 
    } 

    @Override 
    public String toString() { 
     return "Country{" + "name='" + name + '\'' + '}'; 
    } 
} 

public static class Holder { 

    private String x; 
    private Country y; 

    public Holder() { 
    } 

    public void setX(String x) { 
     this.x = x; 
    } 

    public void setY(Country y) { 
     this.y = y; 
    } 

    @Override 
    public String toString() { 
     return "Holder{" + "x='" + x + '\'' + ", y=" + y + '}'; 
    } 
} 


@Test 
public void test() { 
    GsonBuilder gson = new GsonBuilder(); 
    gson.registerTypeAdapter(Country.class, (JsonDeserializer) (json, typeOfT, context) -> { 
     if (!json.isJsonPrimitive() || !json.getAsJsonPrimitive().isString()) { 
      throw new JsonParseException("I only parse strings"); 
     } 
     return new Country(json.getAsString()); 
    }); 
    Holder holder = gson.create().fromJson("{'x':'a','y':'New Zealand'}", Holder.class); 
    //prints Holder{x='a', y=Country{name='New Zealand'}} 
    System.out.println(holder); 
} 
Смежные вопросы