如何使用jackson遍历生成的json模式并将自定义属性放在json模式中

{ "type": "object", "properties": { "name": { "type": "string" }, "id": { "type": "string" }, "i": { "type": "integer" }, "p": { "type": "object", "properties": { "name": { "type": "string" }, "id": { "type": "string" }, "i": { "type": "integer" }, "p1": { "type": "object", "properties": { "name": { "type": "string" }, "id": { "type": "string" }, "i": { "type": "integer" } } } } } }, "classname": "com.tibco.tea.agent.Person" } 

我有上面生成的模式,我想对其进行一些修改。 如您所见,我在此架构中嵌套了Object。 我想为每个对象插入一个“classname”属性。 任何人都可以建议我如何使用jackson 2.3.0遍历此模式并如上所述操纵它。

如果节点是对象,则可以将它们转换为ObjectNode并使用put方法添加所需的键/值对。

 JSON = // stuff you have in example ObjectMapper mapper = new ObjectMapper(); JsonNode jsonNode = mapper.readTree(JSON); // using root node for this example if (jsonNode.isObject()) { ((ObjectNode) jsonNode).put("classname", "com.stackoverflow.Cheese"); } 

这是我将类名放在生成的模式中的代码。 此代码处理提供数组或非数组参数时的情况。 即Person.class和Person [] .class可以成功处理。 此代码无法处理仍在Jackson上打开的自引用问题 – https://github.com/FasterXML/jackson-databind/issues/339

下面的代码可以实例化如下 –

 public static void main(String[] args) throws IOException { ObjectMapper mapper = new ObjectMapper(); Class cls = Person[].class; if(cls.isArray()){ cls = cls.getComponentType(); } String s = "{\"rootNode\":{\"classname\":\"" + cls.getName() + "\"}," + getAttributeClassnames(cls) + "}"; s = s.replace("\",}", "\"}").replace("},}", "}}"); System.out.println(s); s = mapper.generateJsonSchema(cls).getSchemaNode().put("type", "array") .put("classnames", s).toString(); s = s.replace("\\", "").replace("\"{", "{").replace("}\"", "}"); System.out.println(s); } static String getAttributeClassnames(Class cls) { String s = ""; Field[] field = cls.getDeclaredFields(); int i = 0; while (i < field.length) { if (!(field[i].getType() == Boolean.class) && !(field[i].getType() == Integer.class) && !(field[i].getType() == Character.class) && !(field[i].getType() == Byte.class) && !(field[i].getType() == Short.class) && !(field[i].getType() == Long.class) && !(field[i].getType() == Float.class) && !(field[i].getType() == Double.class) && !(field[i].getType().isPrimitive()) && !(field[i].getType() == String.class) && !(Collection.class.isAssignableFrom(field[i] .getType())) && !(Map.class.isAssignableFrom(field[i].getType())) && !(Arrays.class.isAssignableFrom(field[i].getType()))) { if(field[i].getType() == cls){ if (i == field.length - 1) { Class name = null; if(field[i].getType().isArray()){ name = field[i].getType().getComponentType(); }else{ name = field[i].getType(); } s = s + "\"" + field[i].getName() + "\"" + ":{\"classname\":\"" + name.getName() + "\"," +"}"; } else { Class name = null; if(field[i].getType().isArray()){ name = field[i].getType().getComponentType(); }else{ name = field[i].getType(); } s = s + "\"" + field[i].getName() + "\"" + ":{\"classname\":\"" + name.getName() + "\"," + "}" + ","; } }else{ if (i == field.length - 1) { Class name = null; if(field[i].getType().isArray()){ name = field[i].getType().getComponentType(); }else{ name = field[i].getType(); } s = s + "\"" + field[i].getName() + "\"" + ":{\"classname\":\"" + name.getName() + "\"," + getAttributeClassnames(name) + "}"; } else { Class name = null; if(field[i].getType().isArray()){ name = field[i].getType().getComponentType(); }else{ name = field[i].getType(); } s = s + "\"" + field[i].getName() + "\"" + ":{\"classname\":\"" + name.getName() + "\"," + getAttributeClassnames(name) + "}" + ","; } } } i++; } return s; }