1

文字列のみが含まれていることを確認したいJSON配列があります。Jackson は、整数と日付を文字列に暗黙的にキャストします。JSON 配列のすべての要素が実際には文字列であることを確認したいと思います。

    Object[] badModuleArray = new Object[]{"case", 1, 2, "employee", new Date()};

    ObjectMapper objectMapper = new ObjectMapper();
    String jsonModules = objectMapper.writeValueAsString(badModuleArray);

    try
    {
        TypeFactory typeFactory = TypeFactory.defaultInstance();
        mapper.readValue(modules, typeFactory.constructCollectionType(List.class, String.class));
    }
    catch(IOException e)
    {
        logger.error("something other than strings in JSON object");

    }

上記の例では、ObjectMapper が整数、日付などを文字列にキャストしないようにします。JSON 配列の各要素が文字列でない場合にスローされる例外が必要です。これは可能ですか?

4

1 に答える 1

2

Jackson は、各オブジェクトを文字列にキャストしています。これは、List<String>.

代わりに、Jackson に aList<Object>を要求し、List の内容を自分で調べて、それらのいずれかが文字列でない場合はエラーをスローします。

List list = objectMapper.readValue(jsonModules, typeFactory.constructCollectionType(List.class, Object.class));
for (Object item : list) {
    System.out.println(item + " is a: " + item.getClass());
    if (!(item instanceof String)) {
        System.out.println("Not a string!");
    }
}

JSON の場合["case",1,2,"employee",1358444552861]:

ケースは a: class java.lang.String
1 は a: class java.lang.Integer
文字列ではありません!
2 は a: class java.lang.Integer
文字列ではありません!
従業員は次のとおりです: クラス java.lang.String
1358444552861 は次のとおりです: クラス java.lang.Long
文字列ではありません!

于 2013-01-17T17:43:52.633 に答える