2

我的JSON数据如下所示:

[
{
  "id":1,
  "ad_name":"Test Ad",
  "ad_text":"This is my ad text"
},
{
  "id":2,
  "ad_name":"Test Ad",
  "ad_text":"This is my ad text"
},
{
  "id":3,
  "ad_name":"Test Ad",
  "ad_text":"This is my ad text"
},
{
  "id":4,
  "ad_name":"Test Ad",
  "ad_text":"This is my ad text"
},
{
  "id":5,
  "ad_name":"Test Ad",
  "ad_text":"This is my ad text"
}
]

我正在使用杰克逊库来解析它,这是我的代码:

try {
        jParser = jfactory.createParser(array);

        while (jParser.nextToken() != JsonToken.END_ARRAY) {

            String fieldname = jParser.getCurrentName();

            if (fieldname != null) {

                if ("id".equals(fieldname)) {
                    jParser.nextToken();
                    if (jParser.getText() != null)
                        id = jParser.getText();

                    System.out.println(id);
                }

                if ("ad_name".equals(fieldname)) {
                    jParser.nextToken();
                    if (jParser.getText() != null)
                        ad_name = jParser.getText();

                    System.out.println(ad_name);
                }

                if ("ad_text".equals(fieldname)) {
                    jParser.nextToken();
                    if (jParser.getText() != null)
                        ad_text = jParser.getText();

                    System.out.println(ad_text);
                }
            }

        }

        jParser.close();
        return adsList;
    } catch (Exception e) {
        e.printStackTrace();
    }

我的解析和所有东西都工作正常。但是当我在日志中打印值时,我得到了重复的值,这意味着每个JSONObject都打印两次。

我在这里想念什么?任何形式的帮助将不胜感激。

4

3 回答 3

4

您的 JSON 非常简单。您可以使用此示例轻松地将其反序列化为 Java POJO 对象。为数组项创建简单的 POJO。

class Ad {

    private int id;
    @JsonProperty("ad_name")
    private String name;
    @JsonProperty("ad_text")
    private String text;

        //getters, setters, toString()
}

现在,您可以像这样反序列化它:

ObjectMapper mapper = new ObjectMapper();

Ad[] array = mapper.readValue(json, Ad[].class);
System.out.println(Arrays.toString(array));

上面的程序打印:

[Ad [id=1, name=Test Ad, text=This is my ad text], Ad [id=2, name=Test Ad, text=This is my ad text], Ad [id=3, name=Test Ad, text=This is my ad text], Ad [id=4, name=Test Ad, text=This is my ad text], Ad [id=5, name=Test Ad, text=This is my ad text]]

我想为您的源代码提供帮助,但它并不完整。对我来说,您的源代码只打印每个属性一次。也许您的代码中有我们看不到的错误?

于 2013-10-21T10:11:37.377 回答
3

我实际上不知道您的代码有什么问题,但是如果您按照您的方式解析 JSON,您实际上不需要 Jackson。您不妨使用 JSONObject。

使用 Jackson,您可以通过这种方式更有效地做到这一点:

广告.java

public class Ad {
 public int id;
 public String ad_name;
 public String ad_text;
}

解析器

JsonFactory jsonFactory = new JsonFactory();
JsonParser jsonParser = f.createJsonParser(your_json_string);
jsonParser.nextToken();
List<Ad> adList = new ArrayList<Ad>();
while (jp.nextToken() == JsonToken.START_OBJECT)) {
   Ad ad = mapper.readValue(jsonParser, Ad.class);
   adList.add(ad);
}
  • Ad.java 中的 getter 和 setter 也是明智之举。
于 2013-10-21T09:38:01.923 回答
2

我已经使用以下解析方法解决了它,我使用了相同的 Jackson 库来解析它:

try {

        jParser = jfactory.createParser(array);

        if (jParser.nextToken() == JsonToken.START_ARRAY) {

            while (jParser.nextToken() != JsonToken.END_ARRAY) {

                if (jParser.nextToken() == JsonToken.FIELD_NAME) {

                    String fieldname = jParser.getCurrentName();

                    if (fieldname != null) {

                        if ("id".equals(fieldname)) {
                            jParser.nextToken();
                            if (jParser.getText() != null)
                                id = jParser.getText();
                        }
                    }

                    if (jParser.nextToken() == JsonToken.FIELD_NAME) {

                        String fieldname1 = jParser.getCurrentName();

                        if ("ad_name".equals(fieldname1)) {
                            jParser.nextToken();
                            if (jParser.getText() != null)
                                ad_name = jParser.getText();
                        }
                    }

                    if (jParser.nextToken() == JsonToken.FIELD_NAME) {

                        String fieldname2 = jParser.getCurrentName();

                        if ("ad_text".equals(fieldname2)) {
                            jParser.nextToken();
                            if (jParser.getText() != null)
                                ad_text = jParser.getText();
                        }
                    }

                    if (jParser.nextToken() == JsonToken.FIELD_NAME) {

                        String fieldname3 = jParser.getCurrentName();

                        if ("ad_image_url".equals(fieldname3)) {
                            jParser.nextToken();
                            if (jParser.getText() != null)
                                ad_image_url = jParser.getText();
                        }
                    }

                    if (jParser.nextToken() == JsonToken.FIELD_NAME) {

                        String fieldname4 = jParser.getCurrentName();

                        if ("ad_click_url".equals(fieldname4)) {
                            jParser.nextToken();
                            if (jParser.getText() != null)
                                ad_click_url = jParser.getText();

                        }

                        adsList.add(new AllAdsModel(id, ad_name, ad_text,
                                ad_image_url, ad_click_url));
                    }
                }
            }

        }

        jParser.close();
        return adsList;
    } catch (Exception e) {
        e.printStackTrace();
    }

希望,它会帮助别人!

于 2013-10-21T11:48:35.260 回答