2014-01-16 57 views
0

我试图JSON字符串转换成Java的POJO,但收到此错误解析时:简单的JSON结构投掷的错误时转换为POJO

org.codehaus.jackson.map.JsonMappingException: Can not instantiate value of type [simple type, class com.json.pojo.Userdatum] from JSON String; no single-String constructor/factory method 
    at org.codehaus.jackson.map.deser.std.StdValueInstantiator._createFromStringFallbacks(StdValueInstantiator.java:379) 
    at org.codehaus.jackson.map.deser.std.StdValueInstantiator.createFromString(StdValueInstantiator.java:268) 
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromString(BeanDeserializer.java:765) 
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:585) 
    at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2732) 
    at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1863) 
    at com.json.pojo.ParseJson.main(ParseJson.java:21) 

这里是我的转换代码:

package com.json.pojo; 

import java.io.IOException; 

import org.codehaus.jackson.JsonParseException; 
import org.codehaus.jackson.map.JsonMappingException; 
import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility; 
import org.codehaus.jackson.annotate.JsonMethod; 
import org.codehaus.jackson.map.DeserializationConfig; 
import org.codehaus.jackson.map.ObjectMapper; 

public class ParseJson { 

    public static void main(String args[]){ 

     String str = "\"userdata\": [ {\"userid\": \"user1\",\"title\": \"Next weeks preview\", \"date\": \"19/12/2013\",\"time\": \"15:00\"}"; 
     org.codehaus.jackson.map.ObjectMapper mapper = new org.codehaus.jackson.map.ObjectMapper();  
     mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); 

     try { 
      com.json.pojo.Userdatum user = mapper.readValue(str, com.json.pojo.Userdatum.class); 
     } catch (JsonParseException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (JsonMappingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

} 

而我的pojo:

package com.json.pojo; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
import javax.annotation.Generated; 
import com.fasterxml.jackson.annotation.JsonAnyGetter; 
import com.fasterxml.jackson.annotation.JsonAnySetter; 
import com.fasterxml.jackson.annotation.JsonInclude; 
import com.fasterxml.jackson.annotation.JsonProperty; 
import com.fasterxml.jackson.annotation.JsonPropertyOrder; 

@JsonInclude(JsonInclude.Include.NON_NULL) 
@Generated("com.googlecode.jsonschema2pojo") 
@JsonPropertyOrder({ 
"userdata" 
}) 
public class UserData { 

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

@JsonProperty("userdata") 
public List<Userdatum> getUserdata() { 
return userdata; 
} 

@JsonProperty("userdata") 
public void setUserdata(List<Userdatum> userdata) { 
this.userdata = userdata; 
} 

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

@JsonAnySetter 
public void setAdditionalProperties(String name, Object value) { 
this.additionalProperties.put(name, value); 
} 

} 


package com.json.pojo; 

import java.util.HashMap; 
import java.util.Map; 
import javax.annotation.Generated; 
import com.fasterxml.jackson.annotation.JsonAnyGetter; 
import com.fasterxml.jackson.annotation.JsonAnySetter; 
import com.fasterxml.jackson.annotation.JsonInclude; 
import com.fasterxml.jackson.annotation.JsonProperty; 
import com.fasterxml.jackson.annotation.JsonPropertyOrder; 

@JsonInclude(JsonInclude.Include.NON_NULL) 
@Generated("com.googlecode.jsonschema2pojo") 
@JsonPropertyOrder({ 
"userid", 
"title", 
"date", 
"time" 
}) 
public class Userdatum { 

@JsonProperty("userid") 
private String userid; 
@JsonProperty("title") 
private String title; 
@JsonProperty("date") 
private String date; 
@JsonProperty("time") 
private String time; 
private Map<String, Object> additionalProperties = new HashMap<String, Object>(); 

@JsonProperty("userid") 
public String getUserid() { 
return userid; 
} 

@JsonProperty("userid") 
public void setUserid(String userid) { 
this.userid = userid; 
} 

@JsonProperty("title") 
public String getTitle() { 
return title; 
} 

@JsonProperty("title") 
public void setTitle(String title) { 
this.title = title; 
} 

@JsonProperty("date") 
public String getDate() { 
return date; 
} 

@JsonProperty("date") 
public void setDate(String date) { 
this.date = date; 
} 

@JsonProperty("time") 
public String getTime() { 
return time; 
} 

@JsonProperty("time") 
public void setTime(String time) { 
this.time = time; 
} 

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

@JsonAnySetter 
public void setAdditionalProperties(String name, Object value) { 
this.additionalProperties.put(name, value); 
} 

} 

生成的pojo一定有什么问题,但它看起来正确t?

回答

0

这有效,出于某种原因,我需要使用@JsonProperty,即使我的属性匹配json属性,我并不认为它们是必需的。

package com.json.pojo; 

import java.io.IOException; 

import org.codehaus.jackson.JsonParseException; 
import org.codehaus.jackson.map.JsonMappingException; 
import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility; 
import org.codehaus.jackson.annotate.JsonMethod; 
import org.codehaus.jackson.map.DeserializationConfig; 
import org.codehaus.jackson.map.ObjectMapper; 

public class ParseJson { 

    public static void main(String args[]){ 

     String str = "{ \"userdata\": [ {\"userid\": \"user1\",\"title\": \"Next weeks preview\", \"date\": \"19/12/2013\",\"time\": \"15:00\"} ] }"; 

     org.codehaus.jackson.map.ObjectMapper mapper = new org.codehaus.jackson.map.ObjectMapper();  
     mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, true); 

     try { 
      com.json.pojo.RequestBean user = mapper.readValue(str, com.json.pojo.RequestBean.class); 

      System.out.println(user.getToAdd().size()); 
     } catch (JsonParseException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (JsonMappingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

} 

package com.json.pojo; 

import java.io.Serializable; 
import java.util.List; 

import org.codehaus.jackson.annotate.JsonIgnoreProperties; 
import org.codehaus.jackson.annotate.JsonProperty; 
import org.codehaus.jackson.map.annotate.JsonSerialize; 

@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) 
@JsonIgnoreProperties(ignoreUnknown = true) 
public class RequestBean implements Serializable { 

    @JsonProperty("userdata") 
    private List<SimpleBean> userdata; 

    public List<SimpleBean> getToAdd() { 
     return userdata; 
    } 

    public void setToAdd(List<SimpleBean> toAdd) { 
     this.userdata = toAdd; 
    } 


    // constructors, getters, setters 
} 

package com.json.pojo; 

import java.io.Serializable; 

import org.codehaus.jackson.annotate.JsonIgnoreProperties; 
import org.codehaus.jackson.annotate.JsonProperty; 
import org.codehaus.jackson.map.annotate.JsonSerialize; 

@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) 
@JsonIgnoreProperties(ignoreUnknown = true) 
public class SimpleBean implements Serializable { 

    @JsonProperty("userid") 
    private String userid; 
    @JsonProperty("title") 
    private String title; 
    @JsonProperty("date") 
    private String date; 
    @JsonProperty("time") 
    private String time; 

    public String getUserid() { 
     return userid; 
    } 
    public void setUserid(String userid) { 
     this.userid = userid; 
    } 
    public String getTitle() { 
     return title; 
    } 
    public void setTitle(String title) { 
     this.title = title; 
    } 
    public String getDate() { 
     return date; 
    } 
    public void setDate(String date) { 
     this.date = date; 
    } 
    public String getTime() { 
     return time; 
    } 
    public void setTime(String time) { 
     this.time = time; 
    } 


}