如何为 JsonObjects 的 JsonObject 创建 Jackson XML POJO class
How to create Jackson XML POJO class for a JsonObject of JsonObjects
我正在尝试为以下 JSON 结构创建 POJO。 Fields
节点很容易连接起来,但我不确定如何使用注释来连接 Description
节点。如果我一直在为该节点定义 JSON 结构,我会创建一个 JsonObjects 的 JsonArray,这将使 java class 变得容易,但由于我没有,我需要弄清楚如何序列化下面的结构:
{
"Fields": {
"Required": ["ftp.hostname"],
"Optional": ["ftp.rootDirectory"]
},
"Description": {
"ftp.hostname": {
"label": "SFTP Hostname",
"description": "SFTP server hostname or IP address"
},
"ftp.rootDirectory": {
"label": "Root Directory",
"description": "The root path on the Data Store accessible by this connector"
}
}
}
请注意,Description
对象中的节点名称与 Fields
节点中定义的值相关,这意味着它们的节点名称可能因有效负载而异。
Fields
节点的class:
public class FieldDetails {
public static final String REQUIRED = "Required";
public static final String OPTIONAL = "Optional";
@JsonProperty(value = REQUIRED, required = true)
private List<String> required;
@JsonProperty(value = OPTIONAL, required = true)
private List<String> optional;
}
到目前为止我对整个对象的了解:
public class FieldDefinitions {
public static final String FIELDS = "Fields";
public static final String DESCRIPTION = "Description";
@JsonProperty(value = FIELDS, required = true)
private FieldDetails fields;
@JsonProperty(value = DESCRIPTION , required = true)
private ??? descriptions;
}
就是这个结构。
public class FieldDefinitions {
@JsonProperty("Fields")
public FieldDetails fields = new FieldDetails();
@JsonProperty("Description")
public Map<String, Property> properties = new HashMap<>();
}
public class FieldDetails {
@JsonProperty("Required")
public List<String> required = new ArrayList<>();
@JsonProperty("Optional")
public List<String> optional = new ArrayList<>();
}
public class Property {
public String label;
public String description;
}
通常,您总是可以将任何 JSON
对象映射到 Map<String, Object>
。如果 JSON
包含许多嵌套对象,Jackson
将自动选择正确的类型:Map
用于对象,List
用于数组。
您还可以像下面那样为 Description
属性声明 class。
class Description {
private String label;
private String description;
// getters, setters, toString
}
整个 Description
是一个很大的 JSON
,您可以将其映射到 Map<String, Description>
。因此,它可能如下所示:
class FieldDefinitions {
public static final String FIELDS = "Fields";
public static final String DESCRIPTION = "Description";
@JsonProperty(value = FIELDS, required = true)
private FieldDetails fields;
@JsonProperty(value = DESCRIPTION, required = true)
private Map<String, Description> descriptions;
// getters, setters, toString
}
其余同理。示例应用程序:
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.util.List;
import java.util.Map;
public class JsonApp {
public static void main(String[] args) throws Exception {
File json = new File("./resource/test.json").getAbsoluteFile();
ObjectMapper mapper = new ObjectMapper();
FieldDefinitions fields = mapper.readValue(json, FieldDefinitions.class);
System.out.println("Required");
fields.getFields().getRequired().forEach(r ->
System.out.println(r + " = " + fields.getDescriptions().get(r)));
System.out.println("Optional");
fields.getFields().getOptional().forEach(r ->
System.out.println(r + " = " + fields.getDescriptions().get(r)));
}
}
对于给定的 JSON
payload
打印:
Required
ftp.hostname = Description{label='SFTP Hostname', description='SFTP server hostname or IP address'}
Optional
ftp.rootDirectory = Description{label='Root Directory', description='The root path on the Data Store accessible by this connector'}
我正在尝试为以下 JSON 结构创建 POJO。 Fields
节点很容易连接起来,但我不确定如何使用注释来连接 Description
节点。如果我一直在为该节点定义 JSON 结构,我会创建一个 JsonObjects 的 JsonArray,这将使 java class 变得容易,但由于我没有,我需要弄清楚如何序列化下面的结构:
{
"Fields": {
"Required": ["ftp.hostname"],
"Optional": ["ftp.rootDirectory"]
},
"Description": {
"ftp.hostname": {
"label": "SFTP Hostname",
"description": "SFTP server hostname or IP address"
},
"ftp.rootDirectory": {
"label": "Root Directory",
"description": "The root path on the Data Store accessible by this connector"
}
}
}
请注意,Description
对象中的节点名称与 Fields
节点中定义的值相关,这意味着它们的节点名称可能因有效负载而异。
Fields
节点的class:
public class FieldDetails {
public static final String REQUIRED = "Required";
public static final String OPTIONAL = "Optional";
@JsonProperty(value = REQUIRED, required = true)
private List<String> required;
@JsonProperty(value = OPTIONAL, required = true)
private List<String> optional;
}
到目前为止我对整个对象的了解:
public class FieldDefinitions {
public static final String FIELDS = "Fields";
public static final String DESCRIPTION = "Description";
@JsonProperty(value = FIELDS, required = true)
private FieldDetails fields;
@JsonProperty(value = DESCRIPTION , required = true)
private ??? descriptions;
}
就是这个结构。
public class FieldDefinitions {
@JsonProperty("Fields")
public FieldDetails fields = new FieldDetails();
@JsonProperty("Description")
public Map<String, Property> properties = new HashMap<>();
}
public class FieldDetails {
@JsonProperty("Required")
public List<String> required = new ArrayList<>();
@JsonProperty("Optional")
public List<String> optional = new ArrayList<>();
}
public class Property {
public String label;
public String description;
}
通常,您总是可以将任何 JSON
对象映射到 Map<String, Object>
。如果 JSON
包含许多嵌套对象,Jackson
将自动选择正确的类型:Map
用于对象,List
用于数组。
您还可以像下面那样为 Description
属性声明 class。
class Description {
private String label;
private String description;
// getters, setters, toString
}
整个 Description
是一个很大的 JSON
,您可以将其映射到 Map<String, Description>
。因此,它可能如下所示:
class FieldDefinitions {
public static final String FIELDS = "Fields";
public static final String DESCRIPTION = "Description";
@JsonProperty(value = FIELDS, required = true)
private FieldDetails fields;
@JsonProperty(value = DESCRIPTION, required = true)
private Map<String, Description> descriptions;
// getters, setters, toString
}
其余同理。示例应用程序:
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.util.List;
import java.util.Map;
public class JsonApp {
public static void main(String[] args) throws Exception {
File json = new File("./resource/test.json").getAbsoluteFile();
ObjectMapper mapper = new ObjectMapper();
FieldDefinitions fields = mapper.readValue(json, FieldDefinitions.class);
System.out.println("Required");
fields.getFields().getRequired().forEach(r ->
System.out.println(r + " = " + fields.getDescriptions().get(r)));
System.out.println("Optional");
fields.getFields().getOptional().forEach(r ->
System.out.println(r + " = " + fields.getDescriptions().get(r)));
}
}
对于给定的 JSON
payload
打印:
Required
ftp.hostname = Description{label='SFTP Hostname', description='SFTP server hostname or IP address'}
Optional
ftp.rootDirectory = Description{label='Root Directory', description='The root path on the Data Store accessible by this connector'}