簡體   English   中英

使用 Jackson 將 Json 解析為 POJO

[英]Parse Json into POJO using Jackson

我有以下 json

{
    "root": {
        "status": "UP",
        "connection1": {
            "status": "UP"
        },
        "connection2": {
            "status": "UP"
        }
    }
}

我還有以下 POJO 類我想將 JSON 轉換為

@JsonIgnoreProperties(ignoreUnknown = true)
public class POJO {

    @JsonProperty("root")
    @JsonDeserialize(using = RootDeserializer.class)
    private Root root;

    //getters + setters
}

public class Root {

    private boolean isAlive;
    private List<Connection> connections;

    public Root(boolean isAlive, List<Connection> connections) {
        this.isAlive = isAlive;
        this.connections = connections;
    }

    //getters + setters
}

@JsonIgnoreProperties(ignoreUnknown = true)
public class Connection {

    private String status;

    //getters + setters
}

最后我有這個解串器將 json 轉換為 Root 實例

public class RootDeserializer extends JsonDeserializer<Root> {

    private static final String CONNECTION_PREFIX = "connection";
    private static final String UP_STATUS = "UP";

    private ObjectMapper objectMapper = new ObjectMapper();

    @Override
    public Root deserialize(JsonParser parser, DeserializationContext context) throws IOException {
        Map<String, Map<String, Object>> rootJsonMap = parser.readValueAs(Map.class);

        boolean isAlive = StringUtils.equals(UP_STATUS, String.valueOf(rootJsonMap.get("status")));
        List<Connection> connections = rootJsonMap.entrySet()
                .stream()
                .filter(entry -> StringUtils.startsWithIgnoreCase(entry.getKey(), CONNECTION_PREFIX))
                .map(this::mapToConnection)
                .collect(Collectors.toList());

        return new Root(isAlive, connections);
    }

    private PosServerConnection mapToConnection(Map.Entry<String, Map<String, Object>> entry) {
        Map<String, Object> connectionJsonMap = entry.getValue();
        return objectMapper.convertValue(connectionJsonMap, Connection.class);
    }
}

這樣我可以將我的所有連接分組到根 class 中的一個列表中。 我的問題是還有其他方法可以做到這一點嗎?

我想在我的 Pojo 類上只使用 Jackson 注釋來做到這一點而沒有這么大的反序列化器

您可以通過使用@JsonAnySetter注釋為List<Connection>自定義Setter來簡單地實現這一點,如下所示。 您還可以參考Jackson 注釋示例以了解其工作原理。

POJO

public class Pojo {
    private Root root;

    //general getters, setters and toString
}

public class Root {
    private String status;
    private List<Connection> connections = new ArrayList<>();

    public List<Connection> getConnections() {
        return connections;
    }

    @JsonAnySetter
    public void setConnections(String name, Connection connection) {
        connection.setName(name);
        this.connections.add(connection);
    }

    //other getters, setters and toString
}

public class Connection {
    private String name;
    private String status;

    //general getters, setters and toString
}

然后,您可以通過Jackson將給定的 JSON 字符串序列化為Pojo

代碼片段

ObjectMapper mapper = new ObjectMapper();
Pojo pojo = mapper.readValue(jsonStr, Pojo.class);
System.out.println(pojo.getRoot().getConnections().toString());

控制台 output

[Connection [name=connection1, status=UP], Connection [name=connection2, status=UP]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM