【问题标题】:Parse Json into POJO using Jackson使用 Jackson 将 Json 解析为 POJO
【发布时间】:2019-11-19 15:44:20
【问题描述】:

我有以下 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);
    }
}

这样我可以将我的所有连接分组到根类中的一个列表中。 我的问题是有没有其他方法可以做到这一点??

我想在没有这么大的反序列化器的情况下只在我的 Pojo 类上使用 Jackson 注释来做到这一点

【问题讨论】:

  • 是的,还有其他方法可以做到这一点。 --- Why is “Is there a way to…” a poorly worded question? --- (仅供参考:我不是反对者)
  • @Andreas 好的。我编辑我的问题
  • 是的,您编辑了问题文本,但没有改进问题。您只是添加了您喜欢的陈述,但问题仍然是一样的,所以答案仍然是一样的:是的,还有其他方法可以做到这一点。

标签: java json jackson objectmapper


【解决方案1】:

您可以通过使用@JsonAnySetter 注释为List&lt;Connection&gt; 自定义Setter 来简单地实现此目的,如下所示。您也可以参考Jackson Annotation Examples 了解其工作原理。

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());

控制台输出

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

【讨论】:

    猜你喜欢
    • 2018-02-22
    • 2017-09-06
    • 2014-05-24
    • 2018-12-11
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 2011-04-26
    相关资源
    最近更新 更多