我在使用 Jackson 序列化为 XML 时似乎遇到了问题。我的代码如下:
测试容器
package com.test;
import java.util.ArrayList;
import com.fasterxml.jackson.annotation.JsonProperty;
public class TestContainer {
private String testContainerID;
private String testContainerMessage;
private ArrayList<TestChild> testContainerChildren;
@JsonProperty("TestContainerID")
public String getTestContainerID() {
return testContainerID;
}
@JsonProperty("TestContainerID")
public void setTestContainerID(String testContainerID) {
this.testContainerID = testContainerID;
}
@JsonProperty("TestContainerMessage")
public String getTestContainerMessage() {
return testContainerMessage;
}
@JsonProperty("TestContainerMessage")
public void setTestContainerMessage(String testContainerMessage) {
this.testContainerMessage = testContainerMessage;
}
@JsonProperty("TestContainerChildren")
public ArrayList<TestChild> getTestContainerChildren() {
return testContainerChildren;
}
@JsonProperty("TestContainerChildren")
public void setTestContainerChildren(ArrayList<TestChild> testContainerChildren) {
this.testContainerChildren = testContainerChildren;
}
} …Run Code Online (Sandbox Code Playgroud) 假设我有以下Java类:
import java.util.List;
import org.apache.commons.lang3.tuple.Pair;
import com.fasterxml.jackson.databind.ObjectMapper;
public class Demo {
public int x;
public int y;
public List<Pair<Integer, Integer>> the_list;
}
Run Code Online (Sandbox Code Playgroud)
我想从以下json格式填充它:
{ "x" : 1,
"y" : 2,
"the_list" : [[1,2],[3,4]]}
Run Code Online (Sandbox Code Playgroud)
使用更快的xml
ObjectMapper mapper = new ObjectMapper();
Run Code Online (Sandbox Code Playgroud)
我可以在那里调用mapper.readTree(json)并填写我需要的一切.问题是我拥有的实际类(不是Demo)包含很多参数,我想从数据绑定功能中受益.
尝试平原:
mapper.readValue(json, Demo.class)
Run Code Online (Sandbox Code Playgroud)
给出以下错误:
com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of
org.apache.commons.lang3.tuple.Pair, problem: abstract types either need to be mapped to
concrete types, have custom deserializer, or be instantiated with additional type
information
Run Code Online (Sandbox Code Playgroud)
有没有办法将自定义解析与数据绑定混合?我查看了注释,但没有找到任何适合该目的的东西(我无法使用mixins来处理泛型,没有调用the_list的自定义setter可能是因为它是一个列表,JsonCreator不是一个选项,因为我没有写Pair类......).
尝试序列化类别时,我得到一个stackoverflow.
例外
警告:StandardWrapperValve [dispatcher]:Servlet调度程序的Servlet.service()在java.lang.ClassLoader.defineClass(ClassLoader.java:760)的java.lang.ClassLoader.defineClass1(本机方法)中抛出异常java.lang.StackOverflowError at org.apache.felix.framework.BundleWiringImpl $ BundleClassLoader.findClass(BundleWiringImpl.java:2279)位于org.apache.felix.framework.BundleWiringImpl的org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1501).在com.fasterxml的java.lang.ClassLoader.loadClass(ClassLoader.java:357)的org.apache.felix.framework.BundleWiringImpl $ BundleClassLoader.loadClass(BundleWiringImpl.java:1955)访问$ 400(BundleWiringImpl.java:75). com的jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:660).quickxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:152)位于com.fasterxml.jackson.databind的com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:100). ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:21)位于com.fasterxml.jackson.databind.ser.BeanPropertyWriter的com.fasterxml.jackson.databind.ser.std.AsArraySerializerBase.serialize(AsArraySerializerBase.java:183). serializeAsField(BeanPropertyWriter.java:541)位于com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:644)的com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java: 152)databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:100)位于com.fasterxml.jackson.databind.ser的com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:21). std.AsArraySerializerBase.serialize(AsArraySerializerBase.java:183)位于com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:541)的com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields( BeanSerializerBase.java:644)at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:152)databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:100)位于com.fasterxml.jackson.databind.ser的com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:21). std.AsArraySerializerBase.serialize(AsArraySerializerBase.java:183)位于com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:541)的com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields( BeanSerializerBase.java:644)at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:152)quickxml.jackson.databind.ser.std.AsArraySerializerBase.serialize(AsArraySerializerBase.java:183)at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:541)at com.fasterxml.jackson.databind. ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:644)at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:152)quickxml.jackson.databind.ser.std.AsArraySerializerBase.serialize(AsArraySerializerBase.java:183)at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:541)at com.fasterxml.jackson.databind. ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:644)at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:152)
Category.java
@Entity
public class Category implements DataObject, Serializable {
@Id
@GeneratedValue
private Long id;
private String title;
private String description;
@ManyToOne @JsonIgnore
private Category parent;
@Override
public long getId() {
return id;
}
@Override
public void setId(long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public …Run Code Online (Sandbox Code Playgroud) 我有这个代码:
final Person p = new Person(1L);
final ObjectMapper mapper = JacksonUtil.INSTANCE.getMapper();
final TypeReference<HashMap<String, Object>> typeMap = new TypeReference<HashMap<String, Object>>() {};
final String personJson= mapper.writeValueAsString(p);
mapper.readValue(personJson, typeMap);
Run Code Online (Sandbox Code Playgroud)
personJson 就好像:
"id" : 1
Run Code Online (Sandbox Code Playgroud)
每当我Long type在我的Json中有一个,当我尝试阅读它时它不起作用.我有这个错误:
com.fasterxml.jackson.databind.JsonMappingException:无法从Integral编号实例化类型[simple type,class org.codehaus.jackson.generated.java.lang.Number]的值; 没有single-int-arg构造函数/工厂方法
我该如何让它接受这种类型Long?是否在映射器中启用了任何功能?
如果我的问题无效,我很抱歉,但想知道 fastxml(jackson-dataformat-xml) 和 Woodstox 之间的关系是什么。文档(https://github.com/FasterXML/jackson-dataformat-xml)建议我在使用 jackson-dataformat-xml 时添加 Woodstox 的 Maven 依赖项。
我使用com.fasterxml.jackson.databind与改造,以处理来自服务器在我的Android应用程序的响应.
由于JSONObject响应太复杂并且包含很多JSONArray,我希望能够将其中一些数组字段解析为String,而不是为这些Array可能包含的每个子对象创建POJO.
有没有办法告诉杰克逊将这些字段保留为字符串而不是将它们解析为实体?
我打算使用纪元毫秒进行反序列化和序列化。然而,只有反序列化有效,但未能序列化回正确的ZonedDateTime.
ObjectMapper mapper = new ObjectMapper();
mapper.setTimeZone(TimeZone.getDefault());
mapper.registerModule(new JavaTimeModule());
mapper.configure(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS, false);
System.out.println(mapper.writeValueAsString(ZonedDateTime.now())); // print 1493703996728 [Expected]
System.out.println(mapper.readValue("1493703996728", ZonedDateTime.class)); // print +49303-08-07T00:52:08+08:00[Asia/Singapore] [Unexpected]
Run Code Online (Sandbox Code Playgroud)
如何使序列化以获取日期2017-05-02T13:46:36.728+08:00[Asia/Singapore]?
com.fasterxml.jackson.* 的版本都是 2.8.8
导入com.fasterxml.jackson.datatype无法解析
如屏幕截图所示,无法解析 import com.fasterxml.jackson.datatype 。
我已经在 build.gradle 中导入了 jackson-datatype-jsr310', version: '2.9.3,如下所示,
buildscript {
ext {
springBootVersion = '1.5.9.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
group = 'com.linkedin.learning'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('org.springframework.boot:spring-boot-starter-web')
runtime('com.h2database:h2')
testCompile('org.springframework.boot:spring-boot-starter-test')
// https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-jsr310
compile group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jsr310', version: '2.9.3'
}
Run Code Online (Sandbox Code Playgroud)
最后几行来自 Maven Repo:https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-jsr310/2.9.3
我想用的是
com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
Run Code Online (Sandbox Code Playgroud)
但是,即使是 com.fasterxml.jackson.datatype 也无法正确导入。
为了解决这个问题,我尝试在 build.gradle 中添加更多依赖项,正如这篇文章所建议的
我有一个很大的 json 文件,大小约为 40Gb。当我尝试将此对象数组文件转换为 java 对象列表时,它崩溃了。我已经使用了最大堆的所有大小xmx,但没有任何效果!
public Set<Interlocutor> readJsonInterlocutorsToPersist() {
String userHome = System.getProperty(USER_HOME);
log.debug("Read file interlocutors "+userHome);
try {
ObjectMapper mapper = new ObjectMapper();
// JSON file to Java object
Set<Interlocutor> interlocutorDeEntities = mapper.readValue(
new File(userHome + INTERLOCUTORS_TO_PERSIST),
new TypeReference<Set<Interlocutor>>() {
});
return interlocutorDeEntities;
} catch (Exception e) {
log.error("Exception while Reading InterlocutorsToPersist file.",
e.getMessage());
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法使用读取此文件BufferedReader,然后逐个对象推送?
我想序列化/反序列化 MultiValuedMap<String,Object>。很难相信 www 中没有示例代码。有谁知道一个例子吗?
这是我的代码片段 import org.apache.commons.collections4.MultiValuedMap;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
public class MultiValuedMapSerializer extends StdSerializer<MultiValuedMap<String,Object>> {
private static final long serialVersionUID = 1L;
public MultiValuedMapSerializer() {
this(null);
}
protected MultiValuedMapSerializer(Class<MultiValuedMap<String,Object>> klass) {
super(klass);
}
@Override
public void serialize(MultiValuedMap<String,Object> value, JsonGenerator gen, SerializerProvider provider) throws IOException {
gen.writeStartObject();
for (Entry<String, Object> entry : value.entries()) {
if(entry.getValue() instanceOf MultiValuedMap){
@SuppressWarnings("unchecked")
MultiValuedMap<String, Object> map = (MultiValuedMap<String, Object>) value;
if (key != null) {
gen.writeFieldName(key);
serialize(map, gen, provider);
} else { …Run Code Online (Sandbox Code Playgroud)