我有下面的Json Schema。如何使用Java對象表示下面的json模式?
{
"name":{
"first":{
"attributeValue":"firstName",
"attributeType":1,
"dataType":1
},
"last":{
"attributeValue":"lastName",
"attributeType":1,
"dataType":1
}
},
"age":{
"attributeValue":"age",
"attributeType":1,
"dataType":2
},
"address":{
"number":{
"attributeValue":"number",
"attributeType":1,
"dataType":1
},
"street":{
"attributeValue":"street",
"attributeType":1,
"dataType":1
},
"city":{
"attributeValue":"city",
"attributeType":1,
"dataType":1
},
"country":{
"attributeValue":"country",
"attributeType":1,
"dataType":1
}
},
"fullName":{
"attributeValue":"#firstName.concat(' ').concat(#lastName)",
"attributeType":2,
"dataType":1
}
}
在這裏,每個具有attributeValue,dataType和attributeType節點的節點都稱爲「Field」。每個其他父節點都是一個處理程序。 「名稱」是具有「第一」和「最後」字段的處理程序。但對於年齡來說,由於沒有父鍵,所以應該有一個名爲「年齡」的處理程序,並且應該添加一個字段「年齡」。處理程序可以有處理程序。處理程序在其中有字段。下面是Handler對象表示。
public interface Handler<T> {
void addField(Field field);
void addHandler(Handler handler);
String getName();
List<Field> getFields();
T handle(T target);
}
以下是字段表示法。
public interface Field<T> {
void setValue(String value);
T getField();
String getFieldName();
}
現在我需要解析json模式並返回一個處理程序列表。以下是我的嘗試。
private List<Handler> parseJsonSchema(Handler handler, String jsonSchema) throws JSONMapperException {
List<Handler> handlerList = new ArrayList<>();
boolean isParentLeaf = false;
Field<ObjectNode> objectNodeField = null;
try {
JsonNode rootNode = objectMapper.readTree(jsonSchema);
Iterator<Map.Entry<String, JsonNode>> childrenIterator = rootNode.fields();
while (childrenIterator.hasNext()) {
Map.Entry<String, JsonNode> field = childrenIterator.next();
System.out.println("Key: " + field.getKey() + "\tValue:" + field.getValue());
if (field.getValue().has("attributeValue") && field.getValue().has("attributeType")
&& field.getValue().has("dataType")) {
if (handler == null) {
handler = jsonNodeHandlerFactory.create(field.getKey());
isParentLeaf = true;
}
JsonNode valueNode = field.getValue();
//String fieldName = valueNode.get("attributeValue").toString();
String fieldName = field.getKey();
String dataType = valueNode.get("dataType").toString();
switch (dataType) {
case "1":
objectNodeField = dataFieldFactory.createStringField(fieldName);
break;
case "2":
objectNodeField = dataFieldFactory.createIntField(fieldName);
break;
case "3":
objectNodeField = dataFieldFactory.createBooleanField(fieldName);
break;
default:
break;
}
handler.addField(objectNodeField);
if(isParentLeaf) {
handlerList.add(handler);
handler =null;
}
} else {
handler = jsonNodeHandlerFactory.create(field.getKey());
List<Handler> handlers = parseJsonSchema(handler, field.getValue().toString());
for (Handler handler1 : handlers) {
if(handler != null) { //means we already have a handler and we've come into another handler
handler.addHandler(handler1);
handlerList.add(handler);
} else {
handlerList.add(handler1);
}
}
handler = null;
}
if ((handler != null && handler.getFields().size() == rootNode.size())) {
handlerList.add(handler);
}
}
} catch (IOException e) {
logger.error(JSON_SCHEMA_PARSE_EXCEPTION, e);
throw new JSONMapperException(JSON_SCHEMA_PARSE_EXCEPTION);
}
return handlerList;
}
但是它覆蓋處理,當有處理程序中處理。此外,它看起來很笨拙,太多空分配和檢查。有沒有更好的方法來做這個方法已經做的事情?這是將模式作爲處理程序列表返回。任何幫助將非常感激。
所以你放棄了json路徑? –
哇你真的沒有什麼可以說我的答案...所以你爲什麼要求幫助... –