【问题标题】:Is there way to deserialise {"number1":5L,"number2":5L} to a class having long fields?有没有办法将 {"number 1":5L,"number2":5L} 反序列化为具有长字段的类?
【发布时间】:2020-07-26 22:24:08
【问题描述】:

当我反序列化JSON:

{"number1":5L,"number2":5L}

到具有long 字段的class,我得到以下错误:

JsonParseException: 意外字符 ('L' ): 期待逗号 分隔对象条目

如何解决?

【问题讨论】:

标签: json jackson numbers long-integer json-deserialization


【解决方案1】:

JSON 有效负载无效。数字不能用结尾的字母L 表示。见下图:

上图来自json.org。要处理无效的JSON,我们需要为Long 类实现自定义反序列化器:

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.deser.std.NumberDeserializers;

import java.io.File;
import java.io.IOException;
import java.util.StringJoiner;

public class JsonPathApp {

    public static void main(String[] args) throws Exception {
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();

        ObjectMapper mapper = new ObjectMapper();
        Id id = mapper.readValue(jsonFile, Id.class);
        System.out.println(id);
    }
}

class LongJsonDeserializer extends JsonDeserializer<Long> {


    private final NumberDeserializers.LongDeserializer longDeserializer = new NumberDeserializers.LongDeserializer(Long.TYPE, 0L);

    @Override
    public Long deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        Long value = longDeserializer.deserialize(p, ctxt);
        goToNextTokenSilently(p);
        return value;
    }

    private void goToNextTokenSilently(JsonParser p) {
        try {
            p.nextToken();
        } catch (Exception e) {
            //log if needed
        }
    }
}

class Id {

    @JsonDeserialize(using = LongJsonDeserializer.class)
    private Long number1;

    @JsonDeserialize(using = LongJsonDeserializer.class)
    private Long number2;

    // getters, setters, toString
}

【讨论】:

    猜你喜欢
    • 2011-01-13
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多