如何使用Jackson从Json文件中获取未命名的属性?

时间:2014-09-11 14:04:41

标签: java json jackson

我正在尝试解析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方法但是它也没有用。

3 个答案:

答案 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

}