作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我以前从未尝试过解析 JSON。我有一些 JSON 格式的书籍,如下所示:
{
"Search": {
"Books": [
{
"isbn": "1849830347",
"title": "American Assassin",
"author": "Vince Flynn",
"price": 7.99
},
{
"isbn": "0857208683",
"title": Kill Shot",
"author": "Vince Flynn",
"price": 5.99
},
...
}
}
我想要的是解析它们并最终得到填充的 Book 对象的列表。我和 Jackson 以及 Google 的 GSON 一起玩过。我终于开始工作了,但我对此并不满意。这只是有效的代码,我希望我的解决方案是将来再次使用 JSON 时的好代码 - 我认为这是低效的,因为我首先将其转换为树,然后解析它。有人可以提出改进建议吗?
List<Book> books = new ArrayList<Book>();
JsonFactory f = new JsonFactory();
JsonParser jp = f.createJsonParser(json);
jp.setCodec(new ObjectMapper());
JsonNode node = jp.readValueAsTree();
JsonNode books = node.findValue("Books");
Iterator<JsonNode> it = books.getElements();
while(it.hasNext()){
JsonNode temp = it.next();
Book book = new Book();
book.setIsbn(temp.findValue("isbn").asText());
book.setTitle(temp.findValue("title").asText());
book.setAuthor(temp.findValue("author").asText());
book.setPrice(temp.findValue("price").asDouble());
books.add(book);
}
我拥有 setCodec 行的唯一原因是因为没有它,我会收到 IllegalStateException 并显示以下消息:没有为解析器定义 ObjectCodec,无法将 JSON 反序列化为 JsonNode 树。
来自Jackson API ,我尝试过使用Streaming API方法。但我必须调用 jp.nextToken() 大约 10 次才能获得第一个 isbn 值,而且它看起来非常困惑。尽管 API 确实表示速度快了 20%/30%。
感谢对此的任何反馈。
最佳答案
您可以在 Gson 中编写自己的反序列化器: https://sites.google.com/site/gson/gson-user-guide#TOC-Writing-a-Deserializer
或者您可以使用所需的 setter 创建一个对象并让 Gson 完成工作: http://java.dzone.com/articles/deserializing-json-java-object
关于java - 如何在 Java 中解析 JSON 对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30548196/
我是一名优秀的程序员,十分优秀!