我正在为JsonSchema使用库com.fasterxml.jackson库,我正在创建一个IntegerSchema对象,当我使用下面的代码设置整数模式的范围时:
main(){
IntegerSchema intSchema = new IntegerSchema();
// setMaximum accepts Double object
intSchema.setMaximum(new Double(102000000));
// setMaximum accepts Double object
intSchema.setMinimum(new Double(100));
printJsonSchema(intSchema);
}
public void printJsonSchema(JsonSchema schema){
ObjectMapper mapper = new ObjectMapper();
try {
logger.info(mapper.writeValueAsString(schema));
} catch (JsonProcessingException e) {
throw new IllegalStateException(e);
}
}
Run Code Online (Sandbox Code Playgroud)
当我使用ObjectMapper将IntegerSchema转换为字符串时得到以下响应:
{"type":"integer","maximum":1.02E8,"minimum":100.0}
Run Code Online (Sandbox Code Playgroud)
最大值和最小值将转换为科学计数法.
但是我需要非科学记谱法的输出如下:
{"type":"integer","maximum":102000000,"minimum":100}
Run Code Online (Sandbox Code Playgroud)
我无法更改IntegerSchema类.
请建议如何在不扩展IntegerSchema类的情况下获得所需的输出?
提前致谢
我使用Jackson API将我的JSON响应映射到java对象.例如,
回复{name:'karthikeyan',年龄:'24',性别:'男'}
@JsonProperty("name")
public String _name;
@JsonProperty("age")
public int _age;
@JsonProperty("gender")
public String _gender;
Run Code Online (Sandbox Code Playgroud)
是Mix-in,它工作得很好.(内部我们将映射这个pojo和Mix-in).现在,我如何在混合中表示以下响应?
{
name :'karthikeyan',
age:'24',
gender:'Male',
interest:
{
books:'xxx',
music:'yyy',
movie:'zzz'
}
}
Run Code Online (Sandbox Code Playgroud)
我试过以下,但没有运气.
@JsonProperty("name")
public String _name;
@JsonProperty("age")
public int _age;
@JsonProperty("gender")
public String _gender;
@JsonProperty("interest")
public InterestPojo interestPojo; //created same format mix-in and pojo for interest params as well.
Run Code Online (Sandbox Code Playgroud)
但无法准确地映射它们,请提出您的意见和想法如何做到这一点?
Spring Boot已经包含核心杰克逊依赖+其他几个.
如果您想要添加org.json或jsr-353数据绑定模块,则可以明确定义这些附加模块的版本.
有没有办法引用其他Jackson模块的相同版本?我想避免任何兼容性问题.
我有一个包含Map(带非String键)和其他一些字段的Class.
public class MyClass() {
private Map<KeyObject, OtherObject> map;
private String someField;
public MyClass(Map<KeyObject, OtherObject> map, String someField) {
this.map = map;
this.someField = someField;
}
// Getters & Setters
}
Run Code Online (Sandbox Code Playgroud)
我想使用Jackson对这个类进行序列化和反序列化.我看到了不同的方法,并决定尝试使用jackson模块.
我按照这篇文章并扩展了JsonDeserializer和JsonSerializer.问题是应该键入这些类,所以看起来应该是这样的
public class keyDeserializer extends JsonDeserializer<Map<KeyObject, OtherObject>> {
...
}
Run Code Online (Sandbox Code Playgroud)
KeySerializer也是如此.
然后添加到模块:
module.addSerializer(new keySerializer());
module.addDeserializer(Map.class, new keyDeserializer());
Run Code Online (Sandbox Code Playgroud)
但这显然是错误的,因为我得到了一个例外:
keySerializer does not define valid handledType() -- must either register with method that takes type argument or make serializer extend 'org.codehaus.jackson.map.ser.std.SerializerBase'
Run Code Online (Sandbox Code Playgroud)
我可以将我的序列化器和反序列化器输入MyClass,但后来我必须手动解析所有这些,这是不合理的.
更新:
我设法通过使用注释绕过代码中的模块创建 …
我正在努力解决这个问题:
我们有一个带有Guava多重映射的Table类(简化代码,基本上是1个成员,2个构造函数,多重映射的getter和setter):
public class Table {
private LinkedHashMultimap<String,Field> fields;
public Table(){
this.fields = LinkedHashMultimap.create();
};
public Table (LinkedHashMultimap<String, Field> fields){
this.fields= fields;
}
public LinkedHashMultimap<String, Field> getFields() {
return fields;
}
public void setFields(LinkedHashMultimap<String, Field> fields) {
this.fields = fields;
}
}
Run Code Online (Sandbox Code Playgroud)
我想使用Jackson 2.4.3使用Spring MVC 3.2.11将其序列化.
POM相关的依赖关系是:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.4.3</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.4.3</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-guava</artifactId>
<version>2.4.3</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.2.11.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>3.2.11.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId> …Run Code Online (Sandbox Code Playgroud) 我正在使用android上的jackson-dataformat-xml
我有一些非常基本的代码,可以在oracle jre上正常工作
JacksonXmlModule module = new JacksonXmlModule();
module.setDefaultUseWrapper(false);
XmlMapper xmlMapper = new XmlMapper(module);
Run Code Online (Sandbox Code Playgroud)
首先,我尝试了适合gradle的官方文档(由我,不确定是否正确完成):
compile 'com.fasterxml.jackson.core:jackson-core:2.5.4'
compile 'com.fasterxml.jackson.core:jackson-annotations:2.5.4'
compile 'com.fasterxml.jackson.core:jackson-databind:2.5.4'
compile 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.5.4'
compile 'org.codehaus.woodstox:woodstox-core-asl:4.4.1'
compile 'javax.xml.stream:stax-api:1.0-2'
Run Code Online (Sandbox Code Playgroud)
结果:gradle将关于将corelibraries捆绑到应用程序中的构建时间失败
...
:app:preDexDebug
trouble processing "javax/xml/stream/EventFilter.class":
Ill-advised or mistaken usage of a core class (java.* or javax.*)
when not building a core library.
...
Run Code Online (Sandbox Code Playgroud)
试图按照肖恩的回答进行第二次尝试 (基本上他用前缀名称重新包装corelibs并重建jackson-dataformat-xml以使用前缀名称)
compile 'com.fasterxml.jackson.core:jackson-core:2.1.2'
compile 'com.fasterxml.jackson.core:jackson-annotations:2.1.2'
compile 'com.fasterxml.jackson.core:jackson-databind:2.1.2'
// Repackaged XML-specific libraries
compile 'edu.usf.cutr.android.xml:jackson-dataformat-xml-android:2.1.2'
compile 'edu.usf.cutr.android.xml:stax2-api-android:3.1.1'
compile 'edu.usf.cutr.android.xml:stax-api-android:1.0-2'
compile 'edu.usf.cutr.android.xml:aalto-xml-android:0.9.8'
Run Code Online (Sandbox Code Playgroud)
复制时构建时间失败
Duplicate files copied in …Run Code Online (Sandbox Code Playgroud) 我正在从 Spring Boot 1.5.21 升级到 2.2.5。
我需要用来MonetaryModule反序列化休息调用,并取决于 Spring 的ObjectMapper.
我在某个@Configuration类(MonetaryModule正在扩展Module)中为此模块定义了这样一个 bean :
@Bean
public MonetaryModule monetaryModule() {
return new MonetaryModule();
}
Run Code Online (Sandbox Code Playgroud)
我可以在/beans端点中看到它已创建。但是,它实际上并未加载到ObjectMapper. 在对 Spring 的代码进行了大量调试和挖掘之后,我得出的结论是JacksonAutoConfiguration. 它有一个名为的内部静态类JacksonObjectMapperBuilderConfiguration,其中有一个bean创建Jackson2ObjectMapperBuilder. 在创建过程中,有一个调用customize()最终会得到这个代码:
private void configureModules(Jackson2ObjectMapperBuilder builder) {
Collection<Module> moduleBeans = getBeans(this.applicationContext, Module.class);
builder.modulesToInstall(moduleBeans.toArray(new Module[0]));
}
Run Code Online (Sandbox Code Playgroud)
这段代码似乎负责将模块加载到 中ObjectMapper,问题是这Jackson2ObjectMapperBuilder实际上并没有被创建。它出现在/beans端点中,但事实上当我在那里断点时我没有到达断点。这解释了为什么模块没有加载到ObjectMapper.
问题是,为什么没有调用这段代码?为什么/bean表明 bean 确实存在?
编辑 …
我正在使用Jackson模块的最新分支 - jackson-module-jsonSchema即2.4.4-Snapshot.
我正在尝试使用@JsonPropertyOrder注释来维护POJO属性的顺序,但它似乎不尊重注释.
我的样本POJO如下 -
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
@JsonPropertyOrder({"a", "b"})
class Pojo {
private String a;
private String b;
public Pojo(final String a, final String b) {
this.a = a;
this.b = b;
}
public void setA(final String a) {
this.a = a;
}
public void setB(final String b) {
this.b = b;
}
public String getA() {
return this.a;
}
public String getB() {
return this.b;
}
}
Run Code Online (Sandbox Code Playgroud)
杰克逊代码如下 -
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.module.jsonSchema.JsonSchema;
import com.fasterxml.jackson.module.jsonSchema.factories.SchemaFactoryWrapper;
public …Run Code Online (Sandbox Code Playgroud) 我遇到了以下错误
java.lang.NoSuchFieldError: WRITE_DURATIONS_AS_TIMESTAMPS
at com.fasterxml.jackson.datatype.joda.ser.DurationSerializer.<init>(DurationSerializer.java:28)
at com.fasterxml.jackson.datatype.joda.ser.DurationSerializer.<init>(DurationSerializer.java:25)
at com.fasterxml.jackson.datatype.joda.JodaModule.<init>(JodaModule.java:45)
Run Code Online (Sandbox Code Playgroud)
我检查了看哪些版本的jackson-datatype-joda可用.似乎maven排除了所有版本不匹配.
这可能导致序列化错误的任何其他原因?
我正在尝试使用jackson对象映射器将字节数组反序列化为java类型.
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class A {
String s;
String b;
}
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class B {
String c;
String b;
}
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class C {
List<CustomType> x;
}
Run Code Online (Sandbox Code Playgroud)
并使用杰克逊方法,
objectMapper.readValue(byte[] data, Class<T> type).
Run Code Online (Sandbox Code Playgroud)
因为我不确定字节数组包含什么对象,所以当它无法创建指定类型的对象时,我希望它失败.但是,objectMapper返回一个对象,其所有字段都初始化为null.我该如何避免这种行为?
Ex:
byte[] b; //contains Class B data
byte[] a; //contains Class A data
byte[] c// contains Class C data
A a = objectMapper.readValue(c, A.class) is returning
{s=null, b = null}
Run Code Online (Sandbox Code Playgroud)
这是我配置了ObjectMapper,
@Bean
public ObjectMapper …Run Code Online (Sandbox Code Playgroud) jackson-modules ×10
jackson ×8
java ×8
json ×3
jsonschema ×2
spring-boot ×2
android ×1
dropwizard ×1
guava ×1
jaxb ×1
map ×1
maven ×1
multimap ×1
spring-mvc ×1