{
"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"
}
我是上面生成的架构,我想对其进行一些修改。如您所见,我已在此架构中嵌套了对象。我想插入"类名"每个对象的属性。任何人都可以建议我如何使用jackson 2.3.0遍历此模式并按上述方法对其进行操作。
答案 0 :(得分:1)
如果节点是对象,您可以将它们转换为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");
}
答案 1 :(得分:0)
这是我将类名放在生成的模式中的代码。此代码处理提供数组或非数组参数时的情况。即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;
}