/** * Retrieve all messages as a JSON object * * <p>The retrieved JSON document is an object where: * * <ul> * <li>keys are string representations of {@link JsonPointer}s, * <li>values are arrays of objects where each individual object is the JSON representation of * one message. * </ul> * * <p>Note: the returned {@link JsonNode} is mutable. * * @see Message#toJsonNode() * @return a JSON object with all validation messages */ public JsonNode asJsonObject() { final ObjectNode ret = JsonNodeFactory.instance.objectNode(); ArrayNode node; List<Message> messages; for (final JsonPointer ptr : msgMap.keySet()) { node = JsonNodeFactory.instance.arrayNode(); messages = MESSAGE_ORDER.sortedCopy(msgMap.get(ptr)); for (final Message message : messages) node.add(message.toJsonNode()); ret.put(ptr.toString(), node); } return ret; }
/** * Return the list of validation messages as a JSON array * * <p>This method makes its best to order validation messages correctly. * * <p>Each message in the resulting array is a JSON object, with the contents of the {@link * Message} and with an added member named {@code path}, which contains the path into the instance * where the error has occurred (as a {@link JsonPointer}). * * @see Message#toJsonNode() * @return a JSON array with all validation messages */ public JsonNode asJsonArray() { final ArrayNode ret = JsonNodeFactory.instance.arrayNode(); ObjectNode node; final Iterable<JsonPointer> paths = Ordering.natural().sortedCopy(msgMap.keySet()); List<Message> messages; for (final JsonPointer ptr : paths) { messages = MESSAGE_ORDER.sortedCopy(msgMap.get(ptr)); for (final Message msg : messages) { node = JsonNodeFactory.instance.objectNode().put("path", ptr.toString()); // I hate to do that... node.putAll((ObjectNode) msg.toJsonNode()); ret.add(node); } } return ret; }