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 IteratorfieldNames = 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可以直接转换
MapscoreByName = mapper.readValue(jsonSource, Map.class);List names = mapper.readValue(jsonSource, List.class);
但是对于POJO类型的List和Map需要指定具体类型
Mapresults = mapper.readValue(jsonSource, new TypeReference