博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Jackson
阅读量:4610 次
发布时间:2019-06-09

本文共 4978 字,大约阅读时间需要 16 分钟。

Java转JSON

  • 从Java对象转换
  • 从JsonNode Tree
  • 构建JSON Stream

从java对象

ObjectMapper mapper = new ObjectMapper();String result = mapper.writeValueAsString(object);

从JsonNode

// Create the node factory that gives us nodes.JsonNodeFactory factory = new JsonNodeFactory(false);// create a json factory to write the treenode as json. for the example// we just write to consoleJsonFactory jsonFactory = new JsonFactory();JsonGenerator generator = jsonFactory.createGenerator(System.out);ObjectMapper mapper = new ObjectMapper();// the root node - albumJsonNode album = factory.objectNode();mapper.writeTree(generator, album);

从JSON Stream

JsonFactory factory = new JsonFactory();JsonGenerator generator = factory.createGenerator(new FileWriter(new File("albums.json")));// start writing with {generator.writeStartObject();generator.writeFieldName("title");generator.writeString("Free Music Archive - Albums");generator.writeFieldName("dataset");// start an arraygenerator.writeStartArray();generator.writeStartObject();generator.writeStringField("album_title", "A.B.A.Y.A.M");generator.writeEndObject();generator.writeEndArray();generator.writeEndObject();generator.close();

JSON转Java

  • Streaming - 使用JsonParser解析JSON stream. 它提供JSON elements作为tokens. 使用JsonGenerator产生JSON字符串
  • Tree Traversing - JSON可以被读进一个JsonNode中, 然后可以通过遍历来找到对应的属性
  • Data Binding - 从JSON字符串构建Java对象

通过Streaming

// Get a list of albums from free music archive. limit the results to 5        String url = "http://freemusicarchive.org/api/get/albums.json?api_key=60BLHNQCAOUFPIBZ&limit=5";        // get an instance of the json parser from the json factory        JsonFactory factory = new JsonFactory();        JsonParser parser = factory.createParser(new URL(url));         // continue parsing the token till the end of input is reached        while (!parser.isClosed()) {            // get the token            JsonToken token = parser.nextToken();            // if its the last token then we are done            if (token == null)                break;            // we want to look for a field that says dataset             if (JsonToken.FIELD_NAME.equals(token) && "dataset".equals(parser.getCurrentName())) {                // we are entering the datasets now. The first token should be                // start of array                token = parser.nextToken();                if (!JsonToken.START_ARRAY.equals(token)) {                    // bail out                    break;                }                // each element of the array is an album so the next token                // should be {                token = parser.nextToken();                if (!JsonToken.START_OBJECT.equals(token)) {                    break;                }                // we are now looking for a field that says "album_title". We                // continue looking till we find all such fields. This is                // probably not a best way to parse this json, but this will                // suffice for this example.                while (true) {                    token = parser.nextToken();                    if (token == null)                        break;                    if (JsonToken.FIELD_NAME.equals(token) && "album_title".equals(parser.getCurrentName())) {                        token = parser.nextToken();                        System.out.println(parser.getText());                    }                 }             }         }     }

通过JsonNode

Jackson通过com.fasterxml.jackson.databind.JsonNode提供一个树形的node, 类似XML DOM树中的node.

// create an ObjectMapper instance.        ObjectMapper mapper = new ObjectMapper();        // use the ObjectMapper to read the json string and create a tree        JsonNode node = mapper.readTree(genreJson);         // lets see what type the node is        System.out.println(node.getNodeType()); // prints OBJECT        // is it a container        System.out.println(node.isContainerNode()); // prints true        // lets find out what fields it has        Iterator
fieldNames = node.fieldNames(); while (fieldNames.hasNext()) { String fieldName = fieldNames.next(); System.out.println(fieldName);// prints title, message, errors, // total, // total_pages, page, limit, dataset }

通过Data Binding

String url = "http://freemusicarchive.org/api/get/albums.json?api_key=60BLHNQCAOUFPIBZ&limit=2";        ObjectMapper mapper = new ObjectMapper();        mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);        Albums albums = mapper.readValue(new URL(url), Albums.class);

对于简单类型的List和Map, Jackson可以直接转换

Map
scoreByName = mapper.readValue(jsonSource, Map.class);List
names = mapper.readValue(jsonSource, List.class);

但是对于POJO类型的List和Map需要指定具体类型

Map
results = mapper.readValue(jsonSource, new TypeReference
>() { } );

转载于:https://www.cnblogs.com/helloz/p/10193159.html

你可能感兴趣的文章
eclipse 找不到 tomcat 的解决方案
查看>>
HDU 1890--Robotic Sort(Splay Tree)
查看>>
connection string for Excel/Access 2010
查看>>
【转】【Python】Python中的__init__.py与模块导入(from import 找不到模块的问题)
查看>>
学习wavenet_vocoder之环境配置
查看>>
常用Maven命令
查看>>
Docker启动mysql的坑2
查看>>
j2ee爬坑行之二 servlet
查看>>
JAVA基础入门(JDK、eclipse下载安装)
查看>>
最基础的applet运用--在applet上画线
查看>>
布局大全
查看>>
eclipse中安装tomcat插件
查看>>
常见设计模式C++代码实现
查看>>
C++线程同步的四种方式(Windows)
查看>>
前端面试集锦(1)
查看>>
What are Upgrade, Product and Package Codes used for? By pusu
查看>>
【转】梯度下降算法以及其Python实现
查看>>
H5的本地存储
查看>>
1035 Password (20 分)
查看>>
VC静态连接库注意事项
查看>>