【问题标题】:How to get a part of JSON as a plain text using Jackson如何使用 Jackson 将 JSON 的一部分作为纯文本获取
【发布时间】:2019-01-30 15:11:58
【问题描述】:

我从 API 获得了以下 JSON:

    "hotel_data": {
        "name": "Hotel Name",
        "checkin_checkout_times": {
            "checkin_from": "14:00",
            "checkin_to": "00:00",
            "checkout_from": "",
            "checkout_to": "12:00"
        },
        "default_language": "en",
        "country": "us",
        "currency": "USD",
        "city": "Miami"
    }

我正在使用 Jackson 库将此 JSON 反序列化为 Java 对象。我不想为checkin_checkout_times 对象创建一个特殊的类。我只想将它作为纯文本获取。喜欢这个"checkin_from": "14:00", "checkin_to": "00:00", "checkout_from": "", "checkout_to": "12:00"

在我的hotel_data 的 POJO 中,checkin_checkout_times 应该是一个字符串,即:

    @JsonProperty("checkin_checkout_times")
    private String checkinCheckoutTimes

这是否可以将 JSON 的这一部分作为纯文本获取?

编辑:我收到com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of java.lang.String out of START_OBJECT token at [Source: (String)... 的错误

【问题讨论】:

  • hotel_data.getString();

标签: java json jackson deserialization


【解决方案1】:

使用JsonNode

只需在您的 POJO 中为 hotel_data 的字段 checkinCheckoutTimes 创建以下 setter,它应该适合您。

public void setCheckinCheckoutTimes(JsonNode node) {
    this.checkinCheckoutTimes = node.toString();
}

示例

String str = "{ \"id\": 1, \"data\": { \"a\": 1 } }";
try {
    System.out.println(new ObjectMapper().readValue(str,Employee.class));
} catch (IOException e) {
    e.printStackTrace();
}

其中Employee如下:

class Employee
{
    private int id;
    private String data;

    public Employee() {
    }

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }

    public String getData() {
        return data;
    }

    public void setData(JsonNode node) {
        this.data = node.toString();
    }

    @Override
    public String toString() {
        return "Employee{" +
                "id=" + id +
                ", data='" + data + '\'' +
                '}';
    }
}

给出以下输出:

Employee{id=1, data='{"a":1}'}

【讨论】:

    【解决方案2】:

    您还可以编写自定义反序列化器,如the article 中所述:

    public class RawJsonDeserializer extends JsonDeserializer<String> {
    
        @Override
        public String deserialize(JsonParser jp, DeserializationContext ctxt)
               throws IOException, JsonProcessingException {
    
            ObjectMapper mapper = (ObjectMapper) jp.getCodec();
            JsonNode node = mapper.readTree(jp);
            return mapper.writeValueAsString(node);
        }
    }
    

    然后在你的类中使用注释:

    public class HotelData {
    
        @JsonProperty("checkin_checkout_times")
        @JsonDeserialize(using = RawJsonDeserializer.class)
        private String checkinCheckoutTimes;
    
        // other attributes
    
        // getters and setters
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-18
      • 2020-04-23
      • 2012-07-25
      • 2022-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多