代码生成(用java使用ObjectMapper遍历生成每一种类型的节点的key和value)
时间: 2024-05-09 16:16:35 浏览: 83
以下是使用 Java 的 ObjectMapper 遍历生成每一种类型的节点的 key 和 value 的代码示例:
```java
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
public class JsonGenerator {
private ObjectMapper mapper = new ObjectMapper();
/**
* 生成 JsonNode 的方法
*
* @param nodeClass 节点类型
* @return JsonNode
*/
public JsonNode generate(Class<?> nodeClass) {
if (nodeClass.isArray()) {
// 处理数组类型
return generateArrayNode(nodeClass.getComponentType());
} else if (nodeClass.isPrimitive() || nodeClass.equals(String.class)) {
// 处理基本类型和字符串类型
return generatePrimitiveNode(nodeClass);
} else {
// 处理对象类型
return generateObjectNode(nodeClass);
}
}
/**
* 生成 ObjectNode 的方法
*
* @param clazz 类型
* @return ObjectNode
*/
private ObjectNode generateObjectNode(Class<?> clazz) {
ObjectNode objectNode = mapper.createObjectNode();
// 遍历类的字段,生成 key-value
for (Field field : clazz.getDeclaredFields()) {
field.setAccessible(true);
try {
// 递归生成 value
JsonNode valueNode = generate(field.getType());
// 添加 key-value 到 object node
objectNode.set(field.getName(), valueNode);
} catch (Exception e) {
// 异常处理
e.printStackTrace();
}
}
return objectNode;
}
/**
* 生成 ArrayNode 的方法
*
* @param clazz 类型
* @return ArrayNode
*/
private ArrayNode generateArrayNode(Class<?> clazz) {
ArrayNode arrayNode = mapper.createArrayNode();
// 递归生成 array 中的元素
JsonNode elementNode = generate(clazz);
arrayNode.add(elementNode);
return arrayNode;
}
/**
* 生成基本类型或字符串类型的 JsonNode
*
* @param clazz 类型
* @return JsonNode
*/
private JsonNode generatePrimitiveNode(Class<?> clazz) {
if (clazz.isAssignableFrom(Integer.class) || clazz.isAssignableFrom(int.class)) {
return mapper.convertValue(0, JsonNode.class);
} else if (clazz.isAssignableFrom(Double.class) || clazz.isAssignableFrom(double.class)) {
return mapper.convertValue(0.0, JsonNode.class);
} else if (clazz.isAssignableFrom(Boolean.class) || clazz.isAssignableFrom(boolean.class)) {
return mapper.convertValue(false, JsonNode.class);
} else if (clazz.isAssignableFrom(String.class)) {
return mapper.convertValue("", JsonNode.class);
} else {
// 非基本类型或字符串类型不予处理
return null;
}
}
}
```
使用示例:
```java
JsonGenerator generator = new JsonGenerator();
JsonNode rootNode = generator.generate(MyClass.class);
String jsonString = rootNode.toString();
System.out.println(jsonString);
```
其中,MyClass 是需要生成 JsonNode 的类。该代码将生成一个 JsonNode,其中包含 MyClass 类的所有字段名和值。可以使用 toString() 方法将其转换为 JSON 字符串。
阅读全文