zoukankan      html  css  js  c++  java
  • Jackson

    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 console
    JsonFactory jsonFactory = new JsonFactory();
    JsonGenerator generator = jsonFactory.createGenerator(System.out);
    ObjectMapper mapper = new ObjectMapper();
    
    // the root node - album
    JsonNode 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 array
    generator.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<String> 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<String, Integer> scoreByName = mapper.readValue(jsonSource, Map.class);
    List<String> names = mapper.readValue(jsonSource, List.class);
    

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

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

    http://www.studytrails.com/java/json/java-jackson-json-tree-parsing/
    https://github.com/FasterXML/jackson-databind

  • 相关阅读:
    [AngularJS] angular-schema-form -- 1
    [MODx] 10. Using Babel for Muti-languages support
    [AngularJS] Using AngularJS interceptors with $http
    [AngularJS] Best Practise
    [Node.js] Creating Demo APIs with json-server
    [HTML5] Input accepts only 6 number characters
    [Heroku] How to pull, push changes
    Runoob-Java-Maven:Maven 引入外部依赖
    Runoob-Java-Maven:Maven 构建 & 项目测试
    Runoob-Java-Maven:Maven 构建 Java 项目
  • 原文地址:https://www.cnblogs.com/helloz/p/10193159.html
Copyright © 2011-2022 走看看