当前位置: 首页 > 面试题库 >

Jackson中键/值对的序列化?

公孙志尚
2023-03-14
问题内容

我有一堂课

class Foo {
  String key;
  String value;
}

并希望将其序列化为"<content of key>":"<content of value>"
如何实现此目标(以及如何反序列"myKey":"myVal"化为Foo对象?

我正在尝试使用

@JsonValue
public String toString() {
   return "\"" + key + "\":\"" + value + "\"";
}

但显然最终会引号过多。

@JsonValue
public String toString() {
    return key + ":" + value;
}

也不起作用,因为它不能创建足够的报价。


问题答案:

我发现了一种使用JsonSerializer的方法:

public class PropertyValueSerializer extends JsonSerializer<Foo> {

    @Override
    public void serialize(Foo property_value, JsonGenerator jsonGenerator,
                          SerializerProvider serializerProvider) throws IOException, JsonProcessingException {

        jsonGenerator.writeStartObject();
        jsonGenerator.writeFieldName(property_value.getKey());
        jsonGenerator.writeString(property_value.getValue());
        jsonGenerator.writeEndObject();
    }

Foo类需要了解这一点:

@JsonSerialize(using = PropertyValueSerializer.class)
public class Foo {

反序列化非常相似:

public class PropertyValueDeserializer extends JsonDeserializer<PROPERTY_VALUE> {

    @Override
    public Foo deserialize(JsonParser jsonParser,
                                      DeserializationContext deserializationContext) throws IOException, JsonProcessingException {

        String tmp = jsonParser.getText(); // {
        jsonParser.nextToken();
        String key = jsonParser.getText();
        jsonParser.nextToken();
        String value = jsonParser.getText();
        jsonParser.nextToken();
        tmp = jsonParser.getText(); // }

        Foo pv = new Foo(key,value);
        return pv;
    }

这也需要在Foo类上进行注释:

@JsonSerialize(using = PropertyValueSerializer.class)
@JsonDeserialize(using = PropertyValueDeserializer.class)
public class Foo implements Serializable{


 类似资料:
  • 嗨,我正面临着地图序列化的问题,其中关键是一个自定义类。

  • 主要内容:1 编写核心类,2 运行测试本文讲解如何将一个Java对象序列化为一个json文件,然后读取该json文件读取回对象。在下面的示例中,我们创建Student类。使用Jackson存储到一个student.json文件,该文件拥有Student对象的JSON表示形式。 1 编写核心类 MainApp: 2 运行测试

  • 我试图使用Jackson将JSON反序列化为Java POJO。在不泄露机密信息的情况下,以下是ObjectMapper反序列化失败时的堆栈跟踪示例: 枚举类型如下所示: 我确实意识到我试图反序列化一个空值。但我认为这仍然有效:反序列化的结果应该等同于具有的映射,这确实是一个有效的Java指令。非常感谢帮助,提前感谢。

  • 我对对象接口的jackson序列化有问题。 我有课 哪个实现 还有上课 哪个实现 上课 我要和Jackson连载Container得到结果 但事实上我得到了结果 尽管我在映射中指定了点的序列化类型(),但在嵌套对象“point”中具有属性“name”。接口点视图没有方法getName,但结果中存在点的字段“name”。 若我从类容器中的方法getMap中删除注释(),我将得到结果 现在点没有属性"

  • 我有一个抽象的超类A,我有几个具体的子类B,C,D 在序列化方面,我执行以下操作: 没问题。我现在想反序列化这个。我知道我不能实例化一个抽象类,那么这是如何实现的呢? 这不起作用: 编辑:我把这个添加到我的抽象超类中:(仍然没有运气) 再次编辑:我现在遇到以下错误: 看看JSON,@class不在那里。我怎样才能做到?我试过: 但这并没有奏效。有这方面的例子吗?如何告诉对象映射器对类使用我的注释?