Как проверить, является ли узел JSON коротким или нет - PullRequest
0 голосов
/ 29 марта 2019

У меня есть узел json, и я должен проверить, является ли он массивом или нет. Если узел является массивом, тогда каждое значение должно быть коротким. Следовательно, для каждого значения я проверяю, является ли оно числом, используя isNumber () API. Однако я хочу знать, является ли этот номер коротким или нет. Как это сделать? Код:

JsonNode attrNode = rootNode.path("product_id_anyof");
if ((attrNode.getNodeType() == JsonNodeType.ARRAY) { ///this part is working.
    for (final JsonNode node : attrNode) {
        if (!node.isShort()) { ///returns false even if the number is a short.
            return false;
        else 
            return true;
        }
    }
}

Ожидается: если дано значение short, оно должно возвращать true, но всегда дает false.

1 Ответ

0 голосов
/ 29 марта 2019

JSON number по умолчанию читается как int, попробуйте вручную проверить, является ли данное значение number short:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.JsonNodeType;

public class Test {

    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        System.out.println(onlyShortsArray(mapper.readTree("[1,2,3,4]")));
        System.out.println(onlyShortsArray(mapper.readTree("[1,2,3, 33333]")));
        System.out.println(onlyShortsArray(mapper.readTree("[1,2,3, \"a\"]")));
    }

    private static boolean onlyShortsArray(JsonNode attrNode) {
        if (attrNode.getNodeType() == JsonNodeType.ARRAY) {
            for (final JsonNode node : attrNode) {
                if (node.isInt()) {
                    try {
                        Short.valueOf(node.asText());
                        continue;
                    } catch (NumberFormatException e) {
                        return false;
                    }
                }
                return false;
            }
            return true;
        }
        return false;
    }
}
...