我是JSON
的新手,如果有人可以帮我解析这个问题,我会很感激。
这就像首先解析数组然后解析对象然后解析属性数组中的东西。
我可以从哪里获得建议?
此代码是我获取json文件的方式
String json = IOUtils.toString(response.getEntity().getContent());
System.out.println(json);
显示的是我需要解析的示例。我需要以下信息:
"name":"",
"attributeName": "Alternate Name",
"attributeValue": "",
"attributeName": "Functional Area",
"attributeValue": "N/A"
[
{
"id": 1234,
"name": "",
"formId": 34,
"sortOrder": 0,
"attributes": [
{
"id": 67899,
"attribute": {
"attributeName": "Alternate Name",
"attributeType": "Text",
"id": 894
},
"attributeValue": ""
},
{
"id": 67185,
"attribute": {
"attributeName": "Description",
"attributeType": "TextArea",
"id": 900
},
"attributeValue": ""
},
{
"id": 11345,
"attribute": {
"attributeName": "Functional Area",
"attributeType": "DropdownList",
"id": 902,
"values": [
{
"id": 3471,
"sortOrder": 0,
"attributeValue": "N/A"
},
{
"id": 3472,
"sortOrder": 1,
"attributeValue": "ES"
},
{
"id": 3473,
"sortOrder": 2,
"attributeValue": "IPC"
},
{
"id": 3474,
"sortOrder": 3,
"attributeValue": "ISS"
},
{
"id": 3475,
"sortOrder": 4,
"attributeValue": "TECH"
}
]
},
"attributeValue": "N/A"
]
然后还有另一个需要解析的数组(类似于上面)。这是一个巨大的文件,可以用同样的方式解析。
提前谢谢
答案 0 :(得分:1)
例如,使用杰克逊:
MyData data = new ObjectMapper().reader(MyData.class).readValue(response.getEntity().getContent());
data.getName(); // "name":""
data.getAttributes().get(0).getAttribute().getName(); // "attributeName": "Alternate Name"
data.getAttributes().get(0).getAttribute().getValue(); // "attributeValue": "",
data.getAttributes().get(2).getAttribute().getName(); // "attributeName": "Functional Area"
data.getAttributes().get(2).getAttribute().getValue(); // "attributeValue": "N/A",
// If you want to get fancy
data.getAttribute("Alternate Name").getValue();
data.getAttribute("Functional Area").getValue();
要执行上述操作,您需要以下映射类。您可以反序列化为Map
,然后使用get
和强制转换,但我更喜欢具有适当方法和类型的Java对象。 @JsonIgnoreProperties
注释允许您仅映射您关心的那些JSON字段。
@JsonIgnoreProperties(ignoreUnknown = true)
public class MyData {
@JsonProperty
private String name;
@JsonProperty
private List<Attribute> attributes;
public String getName() {
return name;
}
public List<Attribute> getAttributes() {
return attributes;
}
// If you want to get fancy
public AttributeSpec getAttribute(String name) {
for(Attribute attr : attributes) {
if(name.equals(attr.getName())) {
return attr;
}
}
throw new IllegalArgumentException("Unknown name " + name);
}
}
@JsonIgnoreProperties(ignoreUnknown = true)
public class Attribute {
@JsonProperty
private AttributeSpec attribute;
public AttributeSpec getAttribute() {
return attribute;
}
}
@JsonIgnoreProperties(ignoreUnknown = true)
public class AttributeSpec {
@JsonProperty
private String attributeName;
@JsonProperty
private String attributeValue;
public String getName() {
return attributeName;
}
public String getValue() {
return attributeValue;
}
}