When I convert a LinkedHashMap directly to Json with GSON, it converts properly, but when I convert it as a class field, it doesn't convert properly. In another case I was working on, only the last element of the LinkedHashMap showed up in the final Json.
public class Example {
public static void main(String[] args) {
Gson gson = new GsonBuilder().setPrettyPrinting().create();
System.out.println("GSON HashMap!");
System.out.println(gson.toJson(hashMe()));
System.out.println("GSON Zone!");
//This doesn't give me the full LinkedHashMap
System.out.print(gson.toJson(zoneMe()));
}
public ZoneChild zoneMe() {
RateChild rate = new RateChild(hashMe());
ZoneChild zone = new ZoneChild();
zone.setName("Example");
zone.setRate(rate);
return zone;
}
public LinkedHashMap<Integer, String> hashMe() {
LinkedHashMap<Integer, String> rates = new LinkedHashMap<Integer, String>();
rates.put(60, "data1");
rates.put(25, "data2");
rates.put(15, "data3");
return rates;
}
public class Zone {
RateChild rate;
public Zone() {
}
public void setRate(RateChild rate) {
this.rate = rate;
}
}
public class ZoneChild extends Zone {
private int level;
private String name;
public ZoneChild() {
}
public void setName(String name) {
this.name = name;
}
public void setLevel(int level) {
this.level = level;
}
}
public class Rate {
LinkedHashMap<Integer, String> rate = new LinkedHashMap<Integer, String>();
public Rate(LinkedHashMap<Integer, String> rate) {
this.rate = rate;
}
}
//I need this class for specialization
public class RateChild extends Rate {
public RateChild(LinkedHashMap<Integer, String> rate) {
super(rate);
}
}
}
The output looks like this:
GSON HashMap!
{
"60": "data1",
"25": "data2",
"15": "data3"
}
GSON Zone!
{
"level": 0,
"name": "Example",
"rate": {
"rate": {}
}
}
I've noticed it doesn't fail when the LinkedHashMap field is directly in the Json converted class (ZoneChild).
Cannot reproduce. Using Java 21.0.1 and Gson 2.10.1, the following code works as expected:
Output: