java - 如何在反序列化 Pojo 时忽略 JSON 根元素

标签 java json

==== 根对象 ====

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
public class RoomInventoryResponse {
    private Map<String, InventoryDetail> inventoryDetail = new HashMap<>();

    public Map<String, InventoryDetail> getInventoryDetail() {
        return inventoryDetail;
    }
    public void setInventoryDetail(Map<String, InventoryDetail> inventoryDetail) {
        this.inventoryDetail = inventoryDetail;
    }
   // To String overridden
}

==== InventoryDe​​tail 对象 ====

import java.util.Objects;
public class InventoryDetail {
    private Integer booked;
    private Integer available;
    public Integer getBooked() {
        return booked;
    }
    public void setBooked(Integer booked) {
        this.booked = booked;
    }
    public Integer getAvailable() {
        return available;
    }
    public void setAvailable(Integer available) {
        this.available = available;
    }
   // To String overridden
}

====== 运行 mentod ====

public class Test{
    public static void main(String[] args) throws JsonProcessingException
     ObjectWriter ow = new  ObjectMapper().writer().withDefaultPrettyPrinter();
            String json = ow.writeValueAsString(request);
            RoomInventoryResponse response = new RoomInventoryResponse();

            Map<String, InventoryDetail> map = new HashMap<>();
            InventoryDetail inventoryDetail = new InventoryDetail();
            inventoryDetail.setAvailable(10);
            inventoryDetail.setBooked(10);
            map.put("2019-02-21", inventoryDetail);

            InventoryDetail inventoryDetail2 = new InventoryDetail();
            inventoryDetail2.setAvailable(15);
            inventoryDetail2.setBooked(10);
            map.put("2019-02-22", inventoryDetail2);

            InventoryDetail inventoryDetail3 = new InventoryDetail();
            inventoryDetail3.setAvailable(15);
            inventoryDetail3.setBooked(10);
            map.put("2019-02-23", inventoryDetail2);
            response.setInventoryDetail(map);
            String json2 = ow.writeValueAsString(response);

       }
    }

当前输出:

Json Format: 
{
  "inventoryDetail" : {
    "2019-02-23" : {
      "booked" : 10,
      "available" : 15
    },
    "2019-02-22" : {
      "booked" : 10,
      "available" : 15
    },
    "2019-02-21" : {
      "booked" : 10,
      "available" : 10
    }
  }
}

预期结果:(我不想从响应中删除 inventoryDe​​tail,如下输出结果)

{
    "2019-09-30": {
        "booked": 0,
        "available": 100
    },
    "2019-09-20": {
        "booked": 0,
        "available": 16
    },
    "2019-09-12": {
        "booked": 0,
        "available": 10
    }
}

另一个要求是如何改变大写或小的根元素标签,如 inventoryDe​​tail 使之像 InventoryDe​​tail 作为回应,我应该以 as caps 或 small 开头

最佳答案

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializable;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.jsontype.TypeSerializer;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class RoomInventoryResponse implements JsonSerializable {


    private Map<String, InventoryDetail> inventoryDetail = new HashMap<>();

    public Map<String, InventoryDetail> getInventoryDetail() {
        return inventoryDetail;
    }

    public void setInventoryDetail(Map<String, InventoryDetail> inventoryDetail) {
        this.inventoryDetail = inventoryDetail;
    }

    @Override
    public void serialize(JsonGenerator arg0, SerializerProvider arg1) throws IOException {
        arg0.writeObject(inventoryDetail);
    }

    @Override
    public void serializeWithType(JsonGenerator gen, SerializerProvider serializers, TypeSerializer typeSer) throws IOException {

    }
}

最后一个问题:

@JsonTypeName("InventoryDetail") // any name
@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT ,use = JsonTypeInfo.Id.NAME) 
    `

关于java - 如何在反序列化 Pojo 时忽略 JSON 根元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57863691/

相关文章:

java - 从另一个 JPanel 类更改 JFrames 面板

java - 如何在调整JColorChooser 的同时不断更新场景颜色?

java - 有没有办法通过整数调用JLabel

json - JSON 语法是否允许元素使用裸标签?是否允许使用单引号?

javascript - 如何强制同步 $.get 调用将文件内容加载到变量中?

java - Zimbra 邮件服务器 - 如何为 zimbra 邮件服务器创建身份验证证书

java - 如何使用 SwingWorker 避免 GUI 卡住

c# - JSON.NET 中对象集合的错误处理行为与简单类型不同

javascript - 将innerHTML 内容转换回JSON

java - 找不到 MessageBodyWriter vogella 教程