JSON在响应时返回空值

tax*_*eta 0 java json web-services jackson

我response给了我null价值观,但当我运行同样的东西时fiddler,我得到了很多数据.我编写的代码非常少,并使用在线工具生成代码.我想知道我搞砸了.

    Publications response = null ;
    // First open URL connection (using JDK; similar with other libs)
    try {
        URL url = new URL(
                "http://myserver:myport/Mobile/GetPublications");
        HttpURLConnection connection = (HttpURLConnection)url.openConnection() ;
        connection.setDoInput(true);
        connection.setDoOutput(true);
        connection.setRequestMethod("POST") ;
        connection.setRequestProperty("Content-Type", "application/json") ;
        // and other configuration if you want, timeouts etc
        // then send JSON request
        Publications request = new Publications(); // POJO with getters or public fields
        ObjectMapper mapper = new ObjectMapper(); 
        mapper.writeValue(connection.getOutputStream(), request);
        // and read response
        response = mapper.readValue(
                connection.getInputStream(), Publications.class);
    } catch (JsonGenerationException e) {
        e.printStackTrace();
        fail() ;
    } catch (JsonMappingException e) {
        e.printStackTrace();
        fail() ;
    } catch (IOException e) {
        e.printStackTrace();
        fail() ;
    }
    assertNotNull(response) ;
    assertTrue(response.getPublicationInfo() != null) ;
//      assertTrue(response.getPublicationInfo().size() > 0);
//      assertNotNull( ((PublicationInfo)response.getPublicationInfo().get(0)).getPublicationTitle() != null) ;
Run Code Online (Sandbox Code Playgroud)

而出版物POJO是

import com.fasterxml.jackson.*

@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
@Generated("com.googlecode.jsonschema2pojo")
@JsonPropertyOrder({ "ErrorInfo", "PublicationInfo" })
public class Publications {

@JsonProperty("ErrorInfo")
private Object ErrorInfo;

@JsonProperty("PublicationInfo")
private List<PublicationInfo> PublicationInfo = new ArrayList<PublicationInfo>();
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

@JsonProperty("ErrorInfo")
public Object getErrorInfo() {
    return ErrorInfo;
}

@JsonProperty("ErrorInfo")
public void setErrorInfo(Object ErrorInfo) {
    this.ErrorInfo = ErrorInfo;
}

@JsonProperty("PublicationInfo")
public List<PublicationInfo> getPublicationInfo() {
    return PublicationInfo;
}

@JsonProperty("PublicationInfo")
public void setPublicationInfo(
        List<PublicationInfo> PublicationInfo) {
    this.PublicationInfo = PublicationInfo;
}

@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
    return this.additionalProperties;
}

@JsonAnySetter
public void setAdditionalProperties(String name, Object value) {
    this.additionalProperties.put(name, value);
}
}
Run Code Online (Sandbox Code Playgroud)

我在测试用例失败了assertTrue(response.getPublicationInfo().size() > 0);.但是fiddler会返回以下内容

{
"SpecialPublications": {
    "ErrorInfo": null,
    "SpecialPublicationInfo": [
        {
            "Date": "2/3/2010",
            "URL": "SOME URL HERE",
            "Description": "So much to do so less time."
        },
        {
            "Date": "2/4/2010",
            "URL": "SOME MORE URL HERE",
            "Description": "I need more time"
        }
   ]
}
}
Run Code Online (Sandbox Code Playgroud)

Bor*_*jev 5

你应该改变@JsonProperty("PublicationInfo"),以@JsonProperty("SpotlightPublicationInfo")在所有地方.您的属性名称错误.

语义@JsonProperty是:json中出现的属性名称.

编辑还从json中删除虚假属性名称.更换:

response = mapper.readValue(connection.getInputStream(), Publications.class);
Run Code Online (Sandbox Code Playgroud)

附:

JsonNode responseJson = mapper.readTree(connection.getInputStream());
response = mapper.readValue(responseJson.traverse().getValueAsString("SpecialPublications"), Publications.class);
Run Code Online (Sandbox Code Playgroud)

这将删除{"SpecialPublications": ... }您尝试解析的对象的虚假包装.