首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当JSON使用日期作为属性名时,如何使用GSON将JSON反序列化为Java对象?

当JSON使用日期作为属性名时,如何使用GSON将JSON反序列化为Java对象?
EN

Stack Overflow用户
提问于 2015-04-26 13:02:36
回答 1查看 119关注 0票数 0

我有一个JSON响应,我想使用GSON反序列化它。JSON结构使用日期字符串作为属性名。人们将如何进行反序列化这样的。

代码语言:javascript
复制
{
  2015-04-23: [{
     seqNum: 1,
     distance: 13,
     start: "123 Main St"
     end: "225 Broadway"
     },
     {seqNum: 2
      distance: 21,
      start: "225 Broadway"
      end: "12 West St"
      }
   ]
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-26 18:12:37

在我的回答中,我认为您可以得到这样的JSON响应:

代码语言:javascript
复制
{
    "2015-04-23": [
        {
            "seqNum": 1,
            "distance": 13,
            "start": "123 Main St",
            "end": "225 Broadway"
        },
        {
            "seqNum": 2,
            "distance": 21,
            "start": "225 Broadway",
            "end": "12 West St"
        }
    ],

    "2015-04-24": [
            {
                "seqNum": 1,
                "distance": 13,
                "start": "123 Main St",
                "end": "225 Broadway"
            },
            {
                "seqNum": 2,
                "distance": 21,
                "start": "225 Broadway",
                "end": "12 West St"
            }
        ]
}

因此,第一步是创建适当的类。

代码语言:javascript
复制
class MyObject {
    private List<DateMapping> dateMappings;

    public MyObject(List<DateMapping> dateMappings) {
        this.dateMappings = dateMappings;
    }
    ...
}
class DateMapping {
    private Date date;
    private List<Sequence> sequences;

    public DateMapping(Date date, List<Sequence> sequences) {
        this.date = date;
        this.sequences = sequences;
    }
    ...
}

class Sequence {
    private int seqNum;
    private int distance;
    private String start;
    private String end;
    ...
}

现在,如何解析这些键,因为它们是动态的?答案是使用自定义反序列化器:

代码语言:javascript
复制
class MyObjectAdapter implements JsonDeserializer<MyObject> {

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    private static final Type listSequenceType = new TypeToken<List<Sequence>>(){}.getType();

    public MyObject deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        List<DateMapping> dateMappings = new ArrayList<>();
        for(Map.Entry<String, JsonElement> entry : json.getAsJsonObject().entrySet()) {
            try {
                dateMappings.add(new DateMapping(dateFormat.parse(entry.getKey()), context.deserialize(entry.getValue(), listSequenceType)));
            } catch (ParseException e) {
                e.printStackTrace();
                throw new RuntimeException("Can't parse the date");
            }
        }
        return new MyObject(dateMappings);
    }
}

从这里可以看到,我迭代了顶级JsonObject的每个条目,您可以从这些条目中为每个条目创建一个新的DateMapping。然后,您只需在Gson解析器中注册适配器就可以了。

代码语言:javascript
复制
Gson gson = new GsonBuilder().registerTypeAdapter(MyObject.class, new MyObjectAdapter()).create();
MyObject myObject = gson.fromJson(new FileReader(new File("myJson")), MyObject.class);

在上面的示例上运行会产生输出:

代码语言:javascript
复制
MyObject => 
DateMapping Thu Apr 23 00:00:00 CEST 2015, sequences=[Sequence{seqNum=1, distance=13, start='123 Main St', end='225 Broadway'}, Sequence{seqNum=2, distance=21, start='225 Broadway', end='12 West St'}]
DateMapping Fri Apr 24 00:00:00 CEST 2015, sequences=[Sequence{seqNum=1, distance=13, start='123 Main St', end='225 Broadway'}, Sequence{seqNum=2, distance=21, start='225 Broadway', end='12 West St'}]

如果只有一个条目,则可以跳过类MyObject的创建,获得创建单个DateMapping实例的JsonObject的第一个条目。

希望能有所帮助!)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29877970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档