我最近开始使用Jackon
和SmileFactory API's
来序列化JSON文档,但每当我尝试使用SmileFactory
下面是我的主类代码,它将使用Value类使用Jackson制作JSON文档,然后使用ObjectMapper序列化JSON,我也在这里使用SmileFactory将其序列化为二进制数据格式,但每当我尝试使用时,它总是给我异常
public static void main(String[] args) throws JsonGenerationException, JsonMappingException, IOException {
Map<String, Object> properties = new HashMap<String, Object>();
properties.put("id", 123);
properties.put("test", 200);
properties.put("marks", 100);
Value val = new Value();
val.setProperties(properties);
String json = new ObjectMapper().writeValueAsString(val);
System.out.println(json);
// this line is giving me an exception
byte[] smileEncoded = new ObjectMapper(new SmileFactory()).writeValueAsBytes(val);
System.out.println(smileEncoded);
}
下面是我的Value类,它使用Jackson制作JSON文档,并使用ObjectMapper来序列化文档。
@JsonPropertyOrder(value = { "v" })
public class Value {
private Map<String, Object> properties;
/**
* Default constructor.
*/
@JsonCreator
public Value() {
properties = new HashMap<String, Object>();
}
/**
* Gets the properties of this attribute value.
* @return the properties of this attribute value.
*/
@JsonProperty("v")
public Map<String, Object> getProperties() {
return properties;
}
/**
* Sets the properties of this attribute value.
* @param v the properties of this attribute value to set
*/
@JsonProperty("v")
public void setProperties(Map<String, Object> v) {
properties = v;
}
@Override
public String toString() {
try {
return new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(this);
} catch (Exception e) {
// log exception
}
return ToStringBuilder.reflectionToString(this);
}
}
以下是我得到的例外情况 -
Exception in thread "main" java.lang.AbstractMethodError: org/codehaus/jackson/JsonGenerator.writeFieldName(Ljava/lang/String;)V
at org.codehaus.jackson.JsonGenerator.writeFieldName(JsonGenerator.java:516)
at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:444)
at org.codehaus.jackson.map.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:150)
at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:112)
我有Maven依赖 -
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-smile</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.3</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-smile</artifactId>
<version>1.6.0</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>14.0.1</version>
</dependency>
</dependencies>
答案 0 :(得分:2)
您正在混合各种库版本。 com.fasterxml.jackson
是jackson
的最新版本,而org.codehaus.jackson
是旧版本。
我不知道你的项目中可能有哪些其他依赖项,但你应该升级到最新版本的jackson
<!-- JSON serialization -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-smile</artifactId>
<version>${jackson.version}</version>
</dependency>
jackson.version
可以是2.1.1
,就像您拥有或更高。 See here
或者,您可以将jackson-mapper-asl
版本还原为1.6.0
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
1.6.0
版本有一个JsonGeneratorBase
类,用于实现abstract
JsonGenerator#writeFieldName(String)
方法。版本1.9.13
没有,这就是您获得java.lang.AbstractMethodError
的原因。那个错误的javadoc说明了
这个错误只能在运行时发生,如果定义了某个类 由于当前执行的方法是最后一个,因此已经不兼容地更改 编译。
所以你只是使用不兼容的类编译版本。