Simple Spring code to parse JSON

前端 未结 1 1799
忘掉有多难
忘掉有多难 2021-02-08 07:45

I\'m a spring newbie. Wrote really simple code to get an array of JSON object from the API call at http://api.engin.umich.edu/hostinfo/...PONT&room=B505

Only get \"N

1条回答
  •  别跟我提以往
    2021-02-08 08:00

    Tested and working!

    Some observations:

    • If you don't know so much about Spring framework, it doesn't matter. To serialize/deserialize JSON can be done in many ways.

    • I have looked that your JSON contains some reserved words like class or string. In order to handle this you will need to use @JsonProperty annotation (you will see it later at Computer.java and others). I also used this annotation for not declaring some variables that in your JSON properties contain underscores (remember that your DTO's [beans] must have the same structure, datatypes and also use the same JSON property names).

    • To resolve the problem regarding your RestTemplate object (I am not sure if you are doing it the right way when using Computer[].class). As a recommendation, please consider following/checking this code snippet: https://stackoverflow.com/a/6349488/1178686


    • This is just personal: If you consider this answer fits you requirement, don't forget to click the check next to the answer to select it, I am just typing this because you are new here, no offense.

    Code:

    • I have implemented four classes, three of them as DTO's [beans]: Computer.java, Load.java, Location.java and a test class: JSONParse.java. Please review the code!

    Computer.java

    package com.example.dto;
    
    import java.util.List;
    import javax.xml.bind.annotation.XmlRootElement;
    import org.codehaus.jackson.annotate.JsonProperty;
    
    @XmlRootElement
    public class Computer {
    
        private String hostname;
        private String vendor;
        private String model;
        private int swap;
        private int memory;
        @JsonProperty("sess_count")
        private int sessCount;
        private List load;
        @JsonProperty("in_use")
        private boolean inUse;
        @JsonProperty("free_in_tmp")
        private int freeInTmp;
        @JsonProperty("class")
        private String clazz;
        private List location;
        @JsonProperty("last_access")
        private String lastAccess;
        @JsonProperty("last_report")
        private int lastReport;
        private String ip;
    
        public String getHostname() {
            return hostname;
        }
    
        public void setHostname(String hostname) {
            this.hostname = hostname;
        }
    
        public String getVendor() {
            return vendor;
        }
    
        public void setVendor(String vendor) {
            this.vendor = vendor;
        }
    
        public String getModel() {
            return model;
        }
    
        public void setModel(String model) {
            this.model = model;
        }
    
        public int getSwap() {
            return swap;
        }
    
        public void setSwap(int swap) {
            this.swap = swap;
        }
    
        public int getMemory() {
            return memory;
        }
    
        public void setMemory(int memory) {
            this.memory = memory;
        }
    
        public int getSessCount() {
            return sessCount;
        }
    
        public void setSessCount(int sessCount) {
            this.sessCount = sessCount;
        }
    
        public List getLoad() {
            return load;
        }
    
        public void setLoad(List load) {
            this.load = load;
        }
    
        public boolean isInUse() {
            return inUse;
        }
    
        public void setInUse(boolean inUse) {
            this.inUse = inUse;
        }
    
        public int getFreeInTmp() {
            return freeInTmp;
        }
    
        public void setFreeInTmp(int freeInTmp) {
            this.freeInTmp = freeInTmp;
        }
    
        public String getClazz() {
            return clazz;
        }
    
        public void setClazz(String clazz) {
            this.clazz = clazz;
        }
    
        public List getLocation() {
            return location;
        }
    
        public void setLocation(List location) {
            this.location = location;
        }
    
        public String getLastAccess() {
            return lastAccess;
        }
    
        public void setLastAccess(String lastAccess) {
            this.lastAccess = lastAccess;
        }
    
        public int getLastReport() {
            return lastReport;
        }
    
        public void setLastReport(int lastReport) {
            this.lastReport = lastReport;
        }
    
        public String getIp() {
            return ip;
        }
    
        public void setIp(String ip) {
            this.ip = ip;
        }
    
        @Override
        public String toString() {
            String str = "=================================\r\n";
            str += "Hostname: " + hostname + "\r\n" +
                    "Vendor: " + vendor + "\r\n" + 
                    "Model: " + model + "\r\n" +
                    "Swap: " + swap + "\r\n" +
                    "Memory: " + memory + "\r\n" +
                    "Sess_Count: " + sessCount + "\r\n" +
                    "Load: " + "\r\n";
    
            for(Load ld : load) {
                str += "\t" + "One: " + ld.getOne() + "\r\n";
                str += "\t" + "Five: " + ld.getFive() + "\r\n";
                str += "\t" + "Fifteen: " + ld.getFifteen() + "\r\n";
            }
    
            str += "In_Use: " + inUse + "\r\n" +
                    "Free_In_Tmp: " + freeInTmp + "\r\n" +
                    "Class: " + clazz + "\r\n" +
                    "Location: " + "\r\n";
    
            for(Location lc : location) {
                str += "\t" + "Building: " + lc.getBuilding() + "\r\n";
                str += "\t" + "Computers: " + lc.getComputers() + "\r\n";
                str += "\t" + "Room: " + lc.getRoom() + "\r\n";
                str += "\t" + "String: " + lc.getStr() + "\r\n";
            }
    
            str += "Ip: " + ip + "\r\n";
            str += "Last_Access: " + lastAccess + "\r\n";
            str += "Last_Report: " + lastReport + "\r\n";
    
            return str;     
        }
    }
    

    Load.java

    package com.example.dto;
    
    import javax.xml.bind.annotation.XmlRootElement;
    
    @XmlRootElement
    public class Load {
    
        private int one;
        private int five;
        private int fifteen;
    
        public int getOne() {
            return one;
        }
    
        public void setOne(int one) {
            this.one = one;
        }
    
        public int getFive() {
            return five;
        }
    
        public void setFive(int five) {
            this.five = five;
        }
    
        public int getFifteen() {
            return fifteen;
        }
    
        public void setFifteen(int fifteen) {
            this.fifteen = fifteen;
        }
    
    }
    

    Location.java

    package com.example.dto;
    
    import javax.xml.bind.annotation.XmlRootElement;
    
    import org.codehaus.jackson.annotate.JsonProperty;
    
    @XmlRootElement
    public class Location {
    
        private String room;
        private String building;
        private String computers;
        @JsonProperty("string")
        private String str;
    
        public String getRoom() {
            return room;
        }
    
        public void setRoom(String room) {
            this.room = room;
        }
    
        public String getBuilding() {
            return building;
        }
    
        public void setBuilding(String building) {
            this.building = building;
        }
    
        public String getComputers() {
            return computers;
        }
    
        public void setComputers(String computers) {
            this.computers = computers;
        }
    
        public String getStr() {
            return str;
        }
    
        public void setStr(String str) {
            this.str = str;
        }
    
    }
    

    JSONParse.java: runnable class just for testing purposes.

    package com.example.main;
    
    import java.io.IOException;
    import java.net.URL;
    import java.util.List;
    
    import org.codehaus.jackson.JsonParseException;
    import org.codehaus.jackson.map.DeserializationConfig.Feature;
    import org.codehaus.jackson.map.JsonMappingException;
    import org.codehaus.jackson.map.ObjectMapper;
    import org.codehaus.jackson.type.TypeReference;
    
    import com.example.dto.Computer;
    
    public class JSONParse {
    
        public static void main(String args[]) throws JsonParseException, JsonMappingException, IOException {
    
            /* JSON provider */
            URL url = new URL("http://api.engin.umich.edu/hostinfo/v1/computers.json?building=PIERPONT&room=B505");
    
            ObjectMapper mapper = new ObjectMapper();
    
            /*
             * This allows the ObjectMapper to accept single values for a collection.
             * For example: "location" property in the returned JSON is a collection that 
             * can accept multiple objects but, in deserialization process, this property just 
             * have one object and causes an Exception.
             */
            mapper.configure(Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
    
            /* 
             * If some JSON property is not present, avoid exceptions setting
             * FAIL_ON_UNKNOWN_PROPERTIES to false 
             */
            mapper.configure(Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    
            /* Get all computers */
            List computers = mapper.readValue(url, new TypeReference>(){});
    
            /* Print each computer (previously overriding "toString()" method) */
            for(Computer computer : computers) {
                System.out.println(computer.toString());
            }
    
        }
    
    }
    

    Output from the above class:

    =================================
    Hostname: pierb505p13.engin.umich.edu
    Vendor: Linux
    Model: Dell 980
    Swap: 8126456
    Memory: 7797
    Sess_Count: 0
    Load: 
      One: 0
      Five: 0
      Fifteen: 0
    In_Use: false
    Free_In_Tmp: 9608460
    Class: L
    Location: 
      Building: PIERPONT
      Computers: 26
      Room: B505
      String: B505 PIERPONT
    Ip: 141.213.54.23
    Last_Access: 
    Last_Report: 1383202078
    
    =================================
    Hostname: pierb505p22.engin.umich.edu
    Vendor: Linux
    Model: Dell 980
    Swap: 8126456
    Memory: 7797
    Sess_Count: 0
    Load: 
      One: 0
      Five: 0
      Fifteen: 0
    In_Use: false
    Free_In_Tmp: 9609244
    Class: L
    Location: 
      Building: PIERPONT
      Computers: 26
      Room: B505
      String: B505 PIERPONT
    Ip: 141.213.54.32
    Last_Access: 
    Last_Report: 1383201987
    
    =================================
    Hostname: pierb505p06.engin.umich.edu
    Vendor: Linux
    Model: Dell 980
    Swap: 8126456
    Memory: 7797
    Sess_Count: 0
    Load: 
      One: 0
      Five: 0
      Fifteen: 0
    In_Use: false
    Free_In_Tmp: 9606464
    Class: L
    Location: 
      Building: PIERPONT
      Computers: 26
      Room: B505
      String: B505 PIERPONT
    Ip: 141.213.54.16
    Last_Access: 
    Last_Report: 1383201982
    
    =================================
    Hostname: pierb505p17.engin.umich.edu
    Vendor: Linux
    Model: Dell 980
    Swap: 8126456
    Memory: 7797
    Sess_Count: 0
    Load: 
      One: 0
      Five: 0
      Fifteen: 0
    In_Use: false
    Free_In_Tmp: 9606820
    Class: L
    Location: 
      Building: PIERPONT
      Computers: 26
      Room: B505
      String: B505 PIERPONT
    Ip: 141.213.54.27
    Last_Access: 
    Last_Report: 1383202064
    
    =================================
    Hostname: pierb505p15.engin.umich.edu
    Vendor: Linux
    Model: Dell 980
    Swap: 8126456
    Memory: 7797
    Sess_Count: 0
    Load: 
      One: 0
      Five: 0
      Fifteen: 0
    In_Use: false
    Free_In_Tmp: 9609052
    Class: L
    Location: 
      Building: PIERPONT
      Computers: 26
      Room: B505
      String: B505 PIERPONT
    Ip: 141.213.54.25
    Last_Access: 
    Last_Report: 1383202052
    
    =================================
    Hostname: pierb505p12.engin.umich.edu
    Vendor: Linux
    Model: Dell 980
    Swap: 8126456
    Memory: 7797
    Sess_Count: 0
    Load: 
      One: 0
      Five: 0
      Fifteen: 0
    In_Use: false
    Free_In_Tmp: 9607136
    Class: L
    Location: 
      Building: PIERPONT
      Computers: 26
      Room: B505
      String: B505 PIERPONT
    Ip: 141.213.54.22
    Last_Access: 
    Last_Report: 1383202037
    
    =================================
    Hostname: pierb505p03.engin.umich.edu
    Vendor: Linux
    Model: Dell 980
    Swap: 8126456
    Memory: 7797
    Sess_Count: 0
    Load: 
      One: 0
      Five: 0
      Fifteen: 0
    In_Use: false
    Free_In_Tmp: 9603132
    Class: L
    Location: 
      Building: PIERPONT
      Computers: 26
      Room: B505
      String: B505 PIERPONT
    Ip: 141.213.54.13
    Last_Access: 
    Last_Report: 1383201964
    
    =================================
    Hostname: pierb505p14.engin.umich.edu
    Vendor: Linux
    Model: Dell 980
    Swap: 8126456
    Memory: 7797
    Sess_Count: 0
    Load: 
      One: 0
      Five: 0
      Fifteen: 0
    In_Use: false
    Free_In_Tmp: 9599592
    Class: L
    Location: 
      Building: PIERPONT
      Computers: 26
      Room: B505
      String: B505 PIERPONT
    Ip: 141.213.54.24
    Last_Access: 
    Last_Report: 1383201996
    
    =================================
    Hostname: pierb505p07.engin.umich.edu
    Vendor: Linux
    Model: Dell 980
    Swap: 8126456
    Memory: 7797
    Sess_Count: 0
    Load: 
      One: 0
      Five: 0
      Fifteen: 0
    In_Use: false
    Free_In_Tmp: 9608176
    Class: L
    Location: 
      Building: PIERPONT
      Computers: 26
      Room: B505
      String: B505 PIERPONT
    Ip: 141.213.54.17
    Last_Access: 
    Last_Report: 1383202127
    
    =================================
    Hostname: pierb505p23.engin.umich.edu
    Vendor: Linux
    Model: Dell 980
    Swap: 8126456
    Memory: 7797
    Sess_Count: 0
    Load: 
      One: 1
      Five: 0
      Fifteen: 0
    In_Use: false
    Free_In_Tmp: 9600968
    Class: L
    Location: 
      Building: PIERPONT
      Computers: 26
      Room: B505
      String: B505 PIERPONT
    Ip: 141.213.54.33
    Last_Access: 
    Last_Report: 1383202013
    
    =================================
    Hostname: pierb505p11.engin.umich.edu
    Vendor: Linux
    Model: Dell 980
    Swap: 8126456
    Memory: 7797
    Sess_Count: 0
    Load: 
      One: 1
      Five: 0
      Fifteen: 0
    In_Use: false
    Free_In_Tmp: 9607224
    Class: L
    Location: 
      Building: PIERPONT
      Computers: 26
      Room: B505
      String: B505 PIERPONT
    Ip: 141.213.54.21
    Last_Access: 
    Last_Report: 1383202098
    
    =================================
    Hostname: pierb505p21.engin.umich.edu
    Vendor: Linux
    Model: Dell 980
    Swap: 8126456
    Memory: 7797
    Sess_Count: 0
    Load: 
      One: 1
      Five: 0
      Fifteen: 0
    In_Use: false
    Free_In_Tmp: 9595136
    Class: L
    Location: 
      Building: PIERPONT
      Computers: 26
      Room: B505
      String: B505 PIERPONT
    Ip: 141.213.54.31
    Last_Access: 
    Last_Report: 1383202035
    
    =================================
    Hostname: pierb505p16.engin.umich.edu
    Vendor: Linux
    Model: Dell 980
    Swap: 8126456
    Memory: 7797
    Sess_Count: 0
    Load: 
      One: 1
      Five: 0
      Fifteen: 0
    In_Use: false
    Free_In_Tmp: 9601212
    Class: L
    Location: 
      Building: PIERPONT
      Computers: 26
      Room: B505
      String: B505 PIERPONT
    Ip: 141.213.54.26
    Last_Access: 
    Last_Report: 1383202106
    
    =================================
    Hostname: pierb505p04.engin.umich.edu
    Vendor: Linux
    Model: Dell 980
    Swap: 8126456
    Memory: 7797
    Sess_Count: 0
    Load: 
      One: 1
      Five: 0
      Fifteen: 0
    In_Use: false
    Free_In_Tmp: 9603220
    Class: L
    Location: 
      Building: PIERPONT
      Computers: 26
      Room: B505
      String: B505 PIERPONT
    Ip: 141.213.54.14
    Last_Access: 
    Last_Report: 1383202135
    
    =================================
    Hostname: pierb505p08.engin.umich.edu
    Vendor: Windows
    Model: OptiPlex 980
    Swap: 0
    Memory: 0
    Sess_Count: 0
    Load: 
      One: 1
      Five: 5
      Fifteen: 15
    In_Use: false
    Free_In_Tmp: 16024588
    Class: L
    Location: 
      Building: PIERPONT
      Computers: 26
      Room: B505
      String: B505 PIERPONT
    Ip: 141.213.54.18
    Last_Access: 
    Last_Report: 1383202133
    
    =================================
    Hostname: pierb505p25.engin.umich.edu
    Vendor: Windows
    Model: OptiPlex 980
    Swap: 0
    Memory: 0
    Sess_Count: 0
    Load: 
      One: 1
      Five: 5
      Fifteen: 15
    In_Use: false
    Free_In_Tmp: 10299356
    Class: L
    Location: 
      Building: PIERPONT
      Computers: 26
      Room: B505
      String: B505 PIERPONT
    Ip: 141.213.54.35
    Last_Access: 
    Last_Report: 1383202100
    
    =================================
    Hostname: pierb505p26.engin.umich.edu
    Vendor: Windows
    Model: OptiPlex 980
    Swap: 0
    Memory: 0
    Sess_Count: 0
    Load: 
      One: 1
      Five: 5
      Fifteen: 15
    In_Use: false
    Free_In_Tmp: 11303888
    Class: L
    Location: 
      Building: PIERPONT
      Computers: 26
      Room: B505
      String: B505 PIERPONT
    Ip: 141.213.54.36
    Last_Access: 
    Last_Report: 1383202027
    
    =================================
    Hostname: pierb505p19.engin.umich.edu
    Vendor: Windows
    Model: OptiPlex 980
    Swap: 0
    Memory: 0
    Sess_Count: 0
    Load: 
      One: 1
      Five: 5
      Fifteen: 15
    In_Use: false
    Free_In_Tmp: 15914176
    Class: L
    Location: 
      Building: PIERPONT
      Computers: 26
      Room: B505
      String: B505 PIERPONT
    Ip: 141.213.54.29
    Last_Access: 
    Last_Report: 1383202081
    
    =================================
    Hostname: pierb505p09.engin.umich.edu
    Vendor: Windows
    Model: OptiPlex 980
    Swap: 0
    Memory: 0
    Sess_Count: 0
    Load: 
      One: 1
      Five: 5
      Fifteen: 15
    In_Use: false
    Free_In_Tmp: 29956064
    Class: L
    Location: 
      Building: PIERPONT
      Computers: 26
      Room: B505
      String: B505 PIERPONT
    Ip: 141.213.54.19
    Last_Access: 
    Last_Report: 1383201997
    
    =================================
    Hostname: pierb505p10.engin.umich.edu
    Vendor: Windows
    Model: OptiPlex 980
    Swap: 0
    Memory: 0
    Sess_Count: 0
    Load: 
      One: 1
      Five: 5
      Fifteen: 15
    In_Use: false
    Free_In_Tmp: 19663960
    Class: L
    Location: 
      Building: PIERPONT
      Computers: 26
      Room: B505
      String: B505 PIERPONT
    Ip: 141.213.54.20
    Last_Access: 
    Last_Report: 1383202003
    
    =================================
    Hostname: pierb505p24.engin.umich.edu
    Vendor: Windows
    Model: OptiPlex 980
    Swap: 0
    Memory: 0
    Sess_Count: 0
    Load: 
      One: 1
      Five: 5
      Fifteen: 15
    In_Use: false
    Free_In_Tmp: 19197988
    Class: L
    Location: 
      Building: PIERPONT
      Computers: 26
      Room: B505
      String: B505 PIERPONT
    Ip: 141.213.54.34
    Last_Access: 
    Last_Report: 1383202038
    
    =================================
    Hostname: pierb505p20.engin.umich.edu
    Vendor: Windows
    Model: OptiPlex 980
    Swap: 0
    Memory: 0
    Sess_Count: 0
    Load: 
      One: 1
      Five: 5
      Fifteen: 15
    In_Use: false
    Free_In_Tmp: 9585536
    Class: L
    Location: 
      Building: PIERPONT
      Computers: 26
      Room: B505
      String: B505 PIERPONT
    Ip: 141.213.54.30
    Last_Access: 
    Last_Report: 1383201994
    

    Enjoy!

    0 讨论(0)
提交回复
热议问题