我的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
次打印两次。
我在这里缺少什么?任何形式的帮助将不胜感激。
答案 0 :(得分: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]]
我想帮助您使用源代码,但它并不完整。对我来说,您的源代码只打印每个属性一次。也许你的代码中有一个我们无法看到的错误?
答案 1 :(得分:3)
我实际上并不知道你的代码有什么问题,但是如果按照你的方式解析JSON,你实际上并不需要Jackson。你也可以使用JSONObject。
杰克逊可以通过这种方式更有效地做到这一点:
<强> Ad.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);
}
答案 2 :(得分: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();
}
希望,它会帮助别人!