Gson 无法正确将 LinkedHashMap 转换为 JSON

问题描述 投票:0回答:1

当我使用 GSON 将 LinkedHashMap 直接转换为 Json 时,它可以正确转换,但是当我将其转换为类字段时,它无法正确转换。在我正在处理的另一个案例中,只有 LinkedHashMap 的最后一个元素出现在最终的 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);
        }
    }
}

输出如下所示:

GSON HashMap!
{
  "60": "data1",
  "25": "data2",
  "15": "data3"
}
GSON Zone!
{
  "level": 0,
  "name": "Example",
  "rate": {
    "rate": {}
  }
}

我注意到当 LinkedHashMap 字段直接位于 Json 转换类(ZoneChild)中时,它不会失败。

java json gson linkedhashmap
1个回答
0
投票

无法重现。使用 Java 21.0.1 和 Gson 2.10.1,以下代码按预期工作:

import java.util.LinkedHashMap;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class Main {

    public static void main(String[] args) {
        LinkedHashMap<Integer, String> data = new LinkedHashMap<>();
        data.put(60, "data1");
        data.put(25, "data2");
        data.put(15, "data3");

        Zone zone = new ZoneChild(new RateChild(data), "Example", 0);
        System.out.printf("##########  Original   ##########%n%n%s%n%n", zone);

        Gson gson = new GsonBuilder().setPrettyPrinting().create();

        String jsonStr = gson.toJson(zone);
        System.out.printf("########## JSON String ##########%n%n%s%n%n", jsonStr);

        Zone decoded = gson.fromJson(jsonStr, ZoneChild.class);
        System.out.printf("##########   Decoded   ##########%n%n%s%n", decoded);
    }

    public static class Zone {

        RateChild rate;

        public Zone() {}

        public Zone(RateChild rate) {
            this.rate = rate;
        }

        @Override
        public String toString() {
            return String.format("Zone[rate=%s]", rate);
        }
    }

    public static class ZoneChild extends Zone {

        String name;
        int level;

        public ZoneChild() {}

        public ZoneChild(RateChild rate, String name, int level) {
            super(rate);
            this.name = name;
            this.level = level;
        }

        @Override
        public String toString() {
            return String.format("ZoneChild[rate=%s, name=%s, level=%d]", rate, name, level);
        }
    }

    public static class Rate {

        LinkedHashMap<Integer, String> data;

        public Rate() {}

        public Rate(LinkedHashMap<Integer, String> data) {
            this.data = data;
        }

        @Override
        public String toString() {
            return String.format("Rate[data=%s]", data);
        }
    }

    public static class RateChild extends Rate {

        public RateChild() {}

        public RateChild(LinkedHashMap<Integer, String> data) {
            super(data);
        }

        @Override
        public String toString() {
            return String.format("RateChild[data=%s]", data);
        }
    }
}

输出:

##########  Original   ##########

ZoneChild[rate=RateChild[data={60=data1, 25=data2, 15=data3}], name=Example, level=0]

########## JSON String ##########

{
  "name": "Example",
  "level": 0,
  "rate": {
    "data": {
      "60": "data1",
      "25": "data2",
      "15": "data3"
    }
  }
}

##########   Decoded   ##########

ZoneChild[rate=RateChild[data={60=data1, 25=data2, 15=data3}], name=Example, level=0]
© www.soinside.com 2019 - 2024. All rights reserved.