在GSON中,有没有办法将内部类中的字段反序列化为父类?

时间:2015-10-26 23:49:38

标签: java json serialization gson

使用GSON,如果我有一些看起来像这样的JSON:

{
    "foo" : "asdf",
    "bar" : "jkl",
     "city": {
        "name": "Los Angeles",
        "country": "US"
    }
}

有没有办法通过使用SerializedName注释将其反序列化为一个看起来像这样的类?

public class SomeDto {
  String foo;
  String bar;
  String city;
  String country;
}

而不是必须创建内部类并编写特殊的反序列化器?

也许是这样的?

@SerializedName("city.name")
private String city;

2 个答案:

答案 0 :(得分:1)

如果您需要一个班级,您可以申报" city"作为地图 -

<强> Example.java

import java.util.Map;

public class Example {
    String foo;
    String bar;
    Map<String, String> city;
    public String getFoo() {
        return foo;
    }
    public void setFoo(String foo) {
        this.foo = foo;
    }
    public String getBar() {
        return bar;
    }
    public void setBar(String bar) {
        this.bar = bar;
    }
    public Map<String, String> getCity() {
        return city;
    }
    public void setCity(Map<String, String> city) {
        this.city = city;
    }
    @Override
    public String toString() {
        return "Example [foo=" + foo + ", bar=" + bar + ", city=" + city + "]";
    }
}

<强> Main.java

import com.example.Example;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class Main {
    private static Gson gson;

    static {
        gson = new GsonBuilder().create();
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        String s = "{\"foo\":\"asdf\",\"bar\":\"jkl\",\"city\":{\"name\":\"Los Angeles\",\"country\":\"US\"}}";
        Example info = gson.fromJson(s, Example.class);
        System.out.println(info);
   }
}

<强>结果

Example [foo=asdf, bar=jkl, city={name=Los Angeles, country=US}]

答案 1 :(得分:1)

据我所知 - 没有。但是,您可以在方便的界面后隐藏序列化详细信息。

例如:

public class SomeDto {
  private String foo;
  private String bar;
  private City city;

  public String getFoo() {...};
  public String getBar() {...};
  public String getCity() {return city.getName();};
  public String getCountry() {return city.getCountry();};
}