簡體   English   中英

如何使用Jackson將JSON對象鍵解析為整數?

[英]How do you parse JSON object keys as integers with Jackson?

我正在將JSON反序列化為Map<Integer, String>

但是,如果我嘗試將key分配給原始int ,則會收到上述classCastException。

ObjectReader reader = new ObjectMapper().reader(Map.class);
String patternMetadata = "{\"1\":\"name\", \"2\":\"phone\", \"3\":\"query\"}";
Map<Integer, String> map = reader.readValue(patternMetadata);
System.out.println("map: " + map);
for (Map.Entry<Integer, String> entry : map.entrySet())
{
    try
    {
        System.out.println("map: " + entry.getKey());
        int index = entry.getKey();
        System.out.println("map**: " + index);
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

我收到此java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integertry塊的第二行將java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer異常。

我什至嘗試更改int index = enty.getKey().intValue() 但是仍然發生相同的異常。

PS:我正在使用Robolectric框架在Android Studio中運行它。

這些鍵不是整數,而是字符串。 請注意它們上的引號:

String patternMetadata = "{\"1\":\"name\", \"2\":\"phone\", \"3\":\"query\"}";
// ------------------------^^-^^-----------^^-^^------------^^-^^

如果這是JSON(似乎是),則對象屬性名稱始終是字符串。

您將需要Map<String, String> ,然后需要將鍵顯式解析為int (如果需要)。

如果您告訴傑克遜,Jackson可以將密鑰反序列化為某些默認類型(或具有一些額外配置的自定義類型)。

由於Map是通用類型,因此您需要使用TypeReference來描述所需的參數化。

從2.5開始不推薦使用reader 您應該改為使用readerFor 通過為Map提供帶有Integer鍵的適當TypeReference構造ObjectReader 然后,傑克遜會知道您期望將Integer值用作地圖的鍵。

ObjectReader reader = new ObjectMapper().readerFor(new TypeReference<Map<Integer, String>>() {
});

完整的例子

ObjectReader reader = new ObjectMapper().readerFor(new TypeReference<Map<Integer, String>>() {
});
String patternMetadata = "{\"1\":\"name\", \"2\":\"phone\", \"3\":\"query\"}";
Map<Integer, String> map = reader.readValue(patternMetadata);
System.out.println("map: " + map);
for (Map.Entry<Integer, String> entry : map.entrySet()) {
    try {
        System.out.println("map: " + entry.getKey());
        int index = entry.getKey();
        System.out.println("map**: " + index);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

版畫

map: {1=name, 2=phone, 3=query}
map: 1
map**: 1
map: 2
map**: 2
map: 3
map**: 3

暫無
暫無

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

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