如果我有班级A.java:
@JacksonXmlRootElement(localName = "A")
public class A {
}
Run Code Online (Sandbox Code Playgroud)
产生的输出是:
<A
xmlns="">
Run Code Online (Sandbox Code Playgroud)
我想在输出中添加一些名称空间,即
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.com example.xsd"
如何配置A.java包含更多这样的自定义命名空间?
我的操作系统是OS X 10.11.6.我正在运行Spark 2.0,Zeppelin 0.6,Scala 2.11
当我在Zeppelin中运行此代码时,我得到了Jackson的例外.当我在spark-shell中运行此代码时 - 没有例外.
val filestream = ssc.textFileStream("/Users/davidlaxer/first-edition/ch06")
com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.5.3
at com.fasterxml.jackson.module.scala.JacksonModule$class.setupModule(JacksonModule.scala:56)
at com.fasterxml.jackson.module.scala.DefaultScalaModule.setupModule(DefaultScalaModule.scala:19)
at com.fasterxml.jackson.databind.ObjectMapper.registerModule(ObjectMapper.java:651)
at org.apache.spark.rdd.RDDOperationScope$.<init>(RDDOperationScope.scala:82)
at org.apache.spark.rdd.RDDOperationScope$.<clinit>(RDDOperationScope.scala)
at org.apache.spark.streaming.StreamingContext.withNamedScope(StreamingContext.scala:273)
at org.apache.spark.streaming.StreamingContext.textFileStream(StreamingContext.scala:413)
... 51 elided
Run Code Online (Sandbox Code Playgroud)
spark-core中的dependency-reduced-pom.xml显示了2.6.5版本
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.6.5</version>
<scope>compile</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
Maven的版本是:
David-Laxers-MacBook-Pro:2.5.3 davidlaxer$ mvn -version
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-10T08:41:47-08:00)
Maven home: /opt/local/share/java/maven3
Java version: 1.8.0_05, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "mac os x", version: "10.11.6", arch: …Run Code Online (Sandbox Code Playgroud) maven-2 fasterxml apache-spark spark-streaming apache-zeppelin
我的Java对象有一些注释只写入的字段,因为它们不应该通过REST接口发送给用户.
@JsonProperty(access = Access.WRITE_ONLY)
private List<Integer> integerList;
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试实现一个admin-controller,应该发送这些字段.我的问题是,我可以使用控制器中的代码更改属性,还是必须为此目的创建新对象,而目标字段不再被注释.我认为这不是一个干净的解决方案,所以我想我在这里错过了一些FasterXML Jackson功能..
在此先感谢您的帮助,
Codehai
我想要的是有条件地为类的对象使用默认的 BeanSerializer:
class MyCustomSerializer extends StdSerializer<AbstractEntity> {
public MyCustomSerializer() {
super(AbstractEntity.class);
}
@Override
public void serialize(AbstractEntity o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
if (someCondition()) {
serializeNormalWay(); //how?
} else {
//custom serialization
}
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试过做类似的事情:
serializerProvider.defaultSerializeValue(o, jsonGenerator);
Run Code Online (Sandbox Code Playgroud)
但这调用了 MyCustomSerializer 的方法,并且我有永无休止的递归。如何获得可用于普通 bean 序列化的适当 Serializer 对象?
如何通过扩展json为java Calendar创建自定义序列化serializer<Calendar>?
我尝试了相同的java.until.Date,它的工作.在序列化方法中,我将Date转换为String并以json格式写入.
为java.util.Date完成的示例代码类似于下面给出的代码
public class CDJsonDateSerializer extends JsonSerializer<Date>{
@Override
public void serialize(Date date, JsonGenerator jsonGenerator,SerializerProvider provider)
throws IOException {
SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
String dateString = dateFormat.format(date);
jsonGenerator.writeString(dateString);
}
}
Run Code Online (Sandbox Code Playgroud)
它是这样使用的:
@JsonSerialize(using = CDJsonDateSerializer.class)
private Date startDate;
Run Code Online (Sandbox Code Playgroud)
如何在java到json中序列化日历而不丢失Calendar对象中的数据?
问题:您可以使用 CsvMapper/CsvSchema 将 csv 转换为map<string, object>对象不是字符串的对象,例如布尔值或整数吗?
详细信息:我有一些 csv 文件,我想将它们直接转换为 json。我无权访问 POJO。但我确实有一个 xml 架构文件,其中包含 csv 数据中列的类型信息。
经过一些搜索后,我决定使用 Jackson 的 CsvMapper/CsvSchema 将 csv 文件转换为 json。我创建了一个包含列类型信息的 CsvSchema,然后将 csv 文件转换为 Map<> 文件,然后将映射文件转换为 json。除了一件事之外,一切都运行良好。所有 json 属性都是字符串,甚至 CsvSchema 定义为布尔和数字类型的属性也是如此。下面是一个小片段,显示了我正在做的事情。
String csvEmployeeData="\"Bob\",25,true\n" +
"\"Joe\",35,false\n" +
"\"Tom\",45,false\n";
CsvSchema schema = CsvSchema.builder().addColumn("name", ColumnType.String)
.addColumn("age", ColumnType.NUMBER)
.addColumn("isManager", ColumnType.BOOLEAN)
.build();
CsvMapper csvMapper = new CsvMapper();
MappingIterator<Map<String, ? extends Object>> it = csvMapper.readerFor(Map.class)
.with(schema)
.readValues(csvEmployeeData);
List<Map<String, ? extends Object>> objectList=it.readAll();
Map<String, ? extends Object> employeeObj=objectList.get(0);
assertEquals("java.lang.Integer", employeeObj.get("age").getClass().getTypeName());
// …Run Code Online (Sandbox Code Playgroud) 我收到以下错误消息,有人可以帮忙或建议如何最好地调试它。
无法
java.lang.String在 [Source: (PushbackInputStream);反序列化超出 START_OBJECT 令牌的实例;行:1,列:37610](通过参考链:com.model.ProductList["products"]->java.util.ArrayList[23]->com.model.Product["price"]->com.Price [“现在”])
我正在尝试从 REst API 调用反序列化 Products 对象。代码一直运行良好,直到我添加了反序列化 Price 子类的代码。这看起来如下,
"price": {
"was": "",
"then1": "",
"then2": "",
"now": "59.00",
"uom": "",
"currency": "GBP"
},
Run Code Online (Sandbox Code Playgroud)
我的价格 pojo 如下所示,
public class Price {
@JsonProperty("was")
String was;
@JsonProperty("then1")
String then1;
@JsonProperty("then2")
String then2;
@JsonProperty("now")
String now;
@JsonProperty("uom")
String uom;
@JsonProperty("currency")
String currency;
public Price() {
//blank constructor for JSON
}
@Override
public String toString() {
return "Price{" +
"was='" + was + '\'' +
", …Run Code Online (Sandbox Code Playgroud) 我在使用 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) 我使用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
fasterxml ×10
jackson ×7
java ×7
json ×4
spring-boot ×2
android ×1
apache-spark ×1
csv ×1
java-8 ×1
java-ee ×1
maven-2 ×1
namespaces ×1
retrofit2 ×1
xml ×1