用于解析JSON的简单Spring代码

时间:2013-10-31 02:41:10

标签: java json spring

我是一个春天的新手。编写了非常简单的代码,以便从http://api.engin.umich.edu/hostinfo/...PONT&room=B505

的API调用中获取JSON对象数组

只获取“名称:NULL”

import org.springframework.web.client.RestTemplate;

public class Application {
    public static void main(String args[]) {
        RestTemplate restTemplate = new RestTemplate();
        Computer[] computer = restTemplate.getForObject("http://api.engin.umich.edu/hostinfo/v1/computers.json?building=PIERPONT&room=B505", Computer[].class);
        System.out.println("Name:    " + computer[0].getName());
    }
}

这是简单的计算机课程。

package hello;
import org.codehaus.jackson.annotate.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown = true)
public class Computer {
    private String hostname;

    public String getName() {
        return hostname;
    }

    public String toString() {
        return "Computer [hostname=" + hostname + "]";
    }
}

1 个答案:

答案 0 :(得分:22)

经过测试和工作!

一些观察结果:

  • 如果您对Spring framework了解不多,那就无所谓了。 serialize/deserialize JSON可以通过多种方式完成。

  • 我看到您的JSON包含reservedclassstring个字词。为了解决这个问题,您需要使用@JsonProperty注释(稍后会在Computer.java和其他人处看到)。我还使用了这个注释,但没有声明variables属性中包含下划线的某些JSON(请记住,DTO's [beans]必须具有相同的structure },datatypes并使用相同的JSON属性名称。)

  • 要解决有关RestTemplate object 的问题(我不确定您在使用Computer[].class时是否采用正确方法) 。作为建议,请考虑关注/检查此code代码段:https://stackoverflow.com/a/6349488/1178686


  • 这只是个人的: 如果您认为此答案符合您的要求,请不要忘记点击答案旁边的复选框将其选中,我只是打字,因为你是新来的,没有冒犯。

代码:

  • 我已经实现了四个类,其中三个为DTO's [beans]Computer.javaLoad.javaLocation.java和一个测试{{1 }:class。请查看代码!

Computer.java

JSONParse.java

Load.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> load;
    @JsonProperty("in_use")
    private boolean inUse;
    @JsonProperty("free_in_tmp")
    private int freeInTmp;
    @JsonProperty("class")
    private String clazz;
    private List<Location> 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<Load> getLoad() {
        return load;
    }

    public void setLoad(List<Load> 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<Location> getLocation() {
        return location;
    }

    public void setLocation(List<Location> 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;     
    }
}

Location.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;
    }

}

JSONParse.java:runnable 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; } } 仅用于测试目的。

class

以上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<Computer> computers = mapper.readValue(url, new TypeReference<List<Computer>>(){}); /* Print each computer (previously overriding "toString()" method) */ for(Computer computer : computers) { System.out.println(computer.toString()); } } } 的输出:

class

享受!