【问题标题】:how can i parsing this Json String in Java我如何在 Java 中解析这个 Json 字符串
【发布时间】:2018-05-24 15:56:42
【问题描述】:

我的 JSON 字符串:

{ "categorySetName": "TSN", “行”:[ { “日期”:201750, “排名1”:{ "标签": "\uBC30\uACBD", "search_keyword": "\uBC30\uACBD", “频率”:3975, “得分”:69.27185 }, “排名2”:{ "标签": "\uBC30\uACBD\uD654\uBA74", "search_keyword": "\uBC30\uACBD\uD654\uBA74", “频率”:3736, “得分”:109.83768 }, “排名3”:{ "标签": "\uC544\uC774\uD3F0x", "search_keyword": "\uC544\uC774\uD3F0x", “频率”:3382, “得分”:62.057728 }, . . . . “排名500”:{ "标签": "\uC544\uC774\uD3F0x", "search_keyword": "\uC544\uC774\uD3F0x", “频率”:1572, “得分”:68.057728 } } }

我的 Deserializer.Java


@SuppressWarnings("serial")
public class AssociationTopRowDeserializer extends StdDeserializer<AssociationTopRow> {

    public static final String DATE = "date";
    public static final List<String> knownFieldNames = Arrays.asList(DATE);

    public AssociationTopRowDeserializer() {
        this(null);
    }

    public AssociationTopRowDeserializer(Class<AssociationTopRow> c) {
        super(c);
    }

    @Override
    @SuppressWarnings("unchecked")
    public AssociationTopRow deserialize(JsonParser jsonParser, DeserializationContext desContext) throws IOException {
        AssociationTopRow row = new AssociationTopRow();
        JsonNode jsonNode = jsonParser.getCodec().readTree(jsonParser);
        ObjectMapper objectMapper = new ObjectMapper();

        row.setDate(jsonNode.get(DATE).asText());

        String unknownField = getUnknownField(jsonNode.fieldNames());
        if (unknownField != null) {
            Map<String, AssociationTopRowDetail> map = new HashMap<String, AssociationTopRowDetail>();
            map.put(unknownField, (AssociationTopRowDetail) objectMapper.convertValue(jsonNode.get(unknownField),
                    AssociationTopRowDetail.class));
            row.setTransMap(map);
        }
        return row;
    }

    public String getUnknownField(Iterator<String> fieldNames) {
        while (fieldNames.hasNext()) {
            String next = fieldNames.next();
            if (!knownFieldNames.contains(next))
                return next;
        }
        return null;
    }
}

这仅显示有关“rank1”的信息

【问题讨论】:

标签: java jackson


【解决方案1】:

您可以使用@JsonAnySetter 注释代替自定义反序列化器:

public class AssociationTopRow {

    private String date;
    private final Map<String, AssociationTopRowDetail> details = new LinkedHashMap<>();

    // getter & setter for date

    @JsonAnySetter
    public void addDetail(String key, AssociationTopRowDetail detail) {
        details.put(key, detail);
    }

    @JsonAnyGetter
    public Map<String, AssociationTopRowDetail> getDetails() {
        return details;
    }

}

【讨论】:

    猜你喜欢
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    相关资源
    最近更新 更多