我正在尝试解析JSON
个Feed:
{
"test": [
"5",
{
"data": "someData",
"number": "9"
},
{
"data": "someData",
"number": "9"
}
]
}
我使用Jackson
为我解析JSON
文件并使用注释:
private ArrayList<Test> test = new ArrayList<Test>();
/**
* @param test the test to set
*/
public void setTest(ArrayList<Test> test) {
this.test = test;
}
我的Test
课程:
class Test{
private String data= "";
private String number= "";
/**
* @return the data
*/
public String getData() {
return data;
}
/**
* @param data the data to set
*/
public void setData(String data) {
this.data= data;
}
/**
* @return the number
*/
public String getNumber() {
return number;
}
/**
* @param number the number to set
*/
public void setNumber(String number) {
this.number= number;
}
}
如果我从5
中移除JSON
,则可以正常使用。但是5
将在Feed中,因此我需要一种方法来解析它。我对杰克逊和一般注释都是全新的,在花了大部分时间试图弄清楚没有任何运气之后,我需要一些帮助!
我怎样才能忽略&#34; 5&#34;如果它没有命名,我尝试创建一个包含String和ArrayList的容器类,并将其作为参数传递给setTest方法但是它也没有用。
答案 0 :(得分:0)
您的Java Test类表示数组中的对象{"data": "someData", "number": "9"}
。您需要定义另一个Java类来映射Test JSON对象,例如
class TopLevel {
private int count;
List<Test> testList = new ArrayList<Test>();
// ...
//setters and getters
}
答案 1 :(得分:0)
您可以为此列表编写自定义反序列化程序:
class TestListDeserializer extends JsonDeserializer<List<Test>> {
@Override
public List<Test> deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException,
JsonProcessingException {
List<Test> result = new ArrayList<Test>();
while (jp.nextToken() != JsonToken.END_ARRAY) {
if (jp.getCurrentToken() == JsonToken.START_OBJECT) {
result.add(jp.readValueAs(Test.class));
}
}
return result;
}
}
现在,您必须注释test
属性:
@JsonDeserialize(using = TestListDeserializer.class)
private List<Test> test;
答案 2 :(得分:0)
你可以这样做
String jsonStr ="{\"test\": [\"5\",{ \"data\": \"someData\", \"number\": \"9\"},
{ \"data\": \"someData\",\"number\": \"10\"}]}";
JSONObject jsonObject =new JSONObject(jsonStr);
String jsonArr = jsonObject.get("test").toString();
JSONArray jsonArray = new JSONArray(jsonArr);
for(int i =1 ;i<jsonArray.length();i++){
JSONObject object = new JSONObject(jsonArray.get(i).toString());
System.out.println(object.get("data")); // use setter instead
System.out.println(object.get("number")); // use setter instead
}