我有对象链接有List的成员,而链接只有属性但解析列表有错误 - 它被创建为空.
在下面的测试中links.getLinks()返回空列表.有任何想法吗?
XML示例:
<links>
<link x="1" y="2" />
<link x="3" y="4" />
</links>
Run Code Online (Sandbox Code Playgroud)
Java
@JacksonXmlRootElement(localName="links")
public class Links extends BaseAmebaElement {
@JacksonXmlProperty(localName="link")
//@JacksonXmlElementWrapper(localName="link")
private Collection<Link> links;
public Collection<Link> getLinks() {
return links;
}
public void setLinks(Collection<Link> links) {
this.links = links;
}
}
Run Code Online (Sandbox Code Playgroud)
...
@JacksonXmlRootElement(localName="link")
public class Link {
@JacksonXmlProperty(localName="x", isAttribute=true)
private String href;
@JacksonXmlProperty(localName="y", isAttribute=true)
private String rel;
Run Code Online (Sandbox Code Playgroud)
...
XmlMapper xmlMapper = new XmlMapper ();
try {
Links links = xmlMapper.readValue(input, Links.class);
assertNotNull(links);
assertNotNull(links.getLinks());
assertEquals(2, …Run Code Online (Sandbox Code Playgroud) 在从对象解析为json和反之亦然时,我已经有了最可想象的工作时间纳秒.我创造了最简单的杰克逊使用方法,我无法获得纳秒.以下是我的演示.在fastxml FAQ中有三个与我的案例相关的重要声明.前两个给我制作工作的技巧,第三个告诉我不要使用sql.Date但是sql.timestamp是"儿子" sql.Date.
问题是:
首先,
mapper.configure(DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS,true)并@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss.SSSSSS")采取没有任何影响.我可以放置false,true甚至不使用mapper.configure,使用或不使用,@JsonFormat结果将是相同的,
其次,如果我只尝试反序列化,我的意思是,输入值2015-01-07 11:37:52.390452中user.json,只跑mapper.readValue我将获得价值2015-01-07 11:44:22.452,所以我错过了准确的数值,因为Jacskon围捕.
来自http://wiki.fasterxml.com/JacksonFAQDateHandling
1 - Feature.WRITE_DATES_AS_TIMESTAMPS,false); 禁用时间戳(数字)的使用,而是使用符合[ISO-8601]的符号,输出如下:"1970-01-01T00:00:00.000 + 0000".
2 - 您可以通过传递java.text.DateFormat来配置格式
3 - 请不要使用java.sql.Date!
// pojo
package com.jim.core;
import java.sql.Timestamp;
import com.fasterxml.jackson.annotation.JsonFormat;
public class User {
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss.SSSSSS")
private Timestamp tsFirstTry;
private Timestamp tsSecondTry;
@Override
public String toString() {
return "User [tsFirstTry=" + tsFirstTry + ", …Run Code Online (Sandbox Code Playgroud) 我正在消耗两个JSON.
第一个将ID作为String.
"details": {
"id": "316.0"
}
Run Code Online (Sandbox Code Playgroud)
另一个的ID为Integer.
"details": {
"detailId": 316
}
Run Code Online (Sandbox Code Playgroud)
两个JSON都使用FasterXML映射到两个不同的类.我希望两个ID都是整数.现在他们是String.
如何强制ForceXML将"316.0"转换为Integer,以便轻松比较这两个属性?
杰森:
{name:"abc",TxnDateUTC:2015-09-07T21:11:19Z}
Run Code Online (Sandbox Code Playgroud)
Java代码:
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.readValue( jsonString, Message.class );
Run Code Online (Sandbox Code Playgroud)
例外:
Caused by: com.fasterxml.jackson.core.JsonParseException: Unexpected character ('-' (code 45)): was expecting comma to separate OBJECT entries
at [Source: java.io.StringReader@1aa7ecca; line: 1, column: 113]
at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1378)
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:599)
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportUnexpectedChar(ParserMinimalBase.java:520)
at com.fasterxml.jackson.core.json.ReaderBasedJsonParser.nextToken(ReaderBasedJsonParser.java:599)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:301)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2796)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1942)
Run Code Online (Sandbox Code Playgroud)
据我所知,由于日期值未加引号,objectMapper 会抛出异常,因为它不知道如何解析未加引号的值。但是由于我无法控制json格式,我该如何解析这个json呢?
当我引用 json 字符串中的日期值时,相同的代码可以正常工作。
我使用com.fasterxml.jackson和 io.swagger库。在我的 REST 端点中,我使用org.javamoney.moneta.MoneyGET 查询的类型。在部署战争时,我得到以下异常1;
我遵循了这个参考 并编写了以下代码[2];并将其注册到@ApplicationPath。但仍然遇到同样的问题。有什么指南真的会有帮助吗?
@ApplicationPath("/rest")
public class RestApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
HashSet<Class<?>> set = new HashSet<Class<?>>();
set.add(com.test.JsonMoneyProvider.class);
Run Code Online (Sandbox Code Playgroud)
[2]
import javax.money.CurrencyUnit;
import javax.money.Monetary;
import javax.money.MonetaryAmountFactory;
import javax.ws.rs.ext.Provider;
import javax.xml.bind.annotation.XmlTransient;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
@Provider
public class JsonMoneyProvider extends JacksonJsonProvider {
public JsonMoneyProvider() {
ObjectMapper mapper = new ObjectMapper();
mapper.addMixIn(MonetaryAmountFactory.class, MixIn.class);
setMapper(mapper);
}
public static interface MixIn {
@JsonIgnore
@XmlTransient
MonetaryAmountFactory setCurrency(CurrencyUnit currency);
@JsonIgnore …Run Code Online (Sandbox Code Playgroud) 这是一个与此处类似的问题,遗憾的是尚未解决。
如果您想调试代码,请参见GitHub repo。
尽管我已将相关的依赖项添加到Mave中NoClassDefFoundError,ObjectMapper但得到了以下内容pom.xml。
Exception in thread "main" java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ObjectMapper
at demo.DemoMain.main(DemoMain.java:10)
Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.ObjectMapper
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 1 more
Run Code Online (Sandbox Code Playgroud)
这是源代码 DemoMain.java
package demo;
import com.fasterxml.jackson.databind.ObjectMapper;
public class DemoMain {
public static void main(String[] args) {
System.out.println("Start");
ObjectMapper mapper = new ObjectMapper();
System.out.println("End");
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>Demo</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId> …Run Code Online (Sandbox Code Playgroud) 我有以下 XML 文件:
<?xml version="1.0" encoding="UTF-8"?>
<Site xmlns="bla" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="0" affiliations="foo" status="OPERATIONAL" color="#DB2253" updateTime="2002-12-17T09:30:47.0Z" name="GFB_0035" subject="GF">
<location>
<vertices Lat="41.905889" Lon="12.452019"/>
<vertices Lat="41.905973" Lon="12.453596"/>
<vertices Lat="41.905206" Lon="12.453707"/>
<vertices Lat="41.905058" Lon="12.452109"/>
</location>
</Site>
Run Code Online (Sandbox Code Playgroud)
我使用
以下代码FasterXml.Jackson将数据解析为Map<String, Object>对象:
XmlMapper xmlMapper = new XmlMapper();
Map<String, Object> data = xmlMapper.readValue(new File(xmlFile), Map.class);
Run Code Online (Sandbox Code Playgroud)
然而,当我查看"location"字段的内容时,我只有一个顶点而不是四个(最后一个)。
更新: 我得到的地图对象如下所示:
{id=0, affiliations=foo, status=OPERATIONAL, color=#DB2253, updateTime=2002-12-17T09:30:47.0Z, name=GFB_0035, subject=GF, location={vertices={Lat=41.905058, Lon=12.452109}}}
Run Code Online (Sandbox Code Playgroud)
有没有办法使用 获得所有四个条目FasterXml.Jackson?
默认情况下,JacksonObjectMapper将Date和序列Timestamp化为2.9.xLong版本,而 Date则序列化为2.6.x和** 2.6.x* 版本。Formatted StringTimestampLong
例子:
case class Test(date: java.sql.Date, tmp: java.sql.Timestamp)
val test = Test(new java.sql.Date(1588892400000L), new Timestamp(1588892400000L))
writeValueAsString(test)
Run Code Online (Sandbox Code Playgroud)
{"date":"2020-05-08","tmp":1588892400000}//Version 2.6.x
{"date":1588892400000,"tmp":1588892400000}//Version 2.9.x
Run Code Online (Sandbox Code Playgroud)
但我想在2.9.x版本中保持2.6.x版本的行为。
我尝试过disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS),但随后它将Date&转换TimeStamp为Formatted String(如下所示)。
{"date":"2020-05-08","tmp":"2020-05-07T23:00:00.000+0000"}
Run Code Online (Sandbox Code Playgroud)
如果我设置 DateFormatter**,那么它会以相同的格式转换两者。
setDateFormat(new SimpleDateFormat("yyyy-MM-dd"))`
{"date":"2020-05-08","tmp":"2020-05-08"}
Run Code Online (Sandbox Code Playgroud)
**我只是treid它,但我不想设置DateFormatter(即使它有效),因为它也将用于输入日期格式不同的反序列化。
有办法实现这一点吗?
我目前有一个项目使用jackson rapid xml来使用自定义序列化器和反序列化器将POJO序列化/反序列化为Json.据我所知,ObjectMapper一旦创建和配置就是线程安全的.但是,我注意到在使用JMeter运行测试时偶尔会发生以下情况 -
似乎第二个线程进入时JsonGenerator实例正在重置 - 当然这不应该发生?我检查了几个站点和线程,看看是否有我需要设置的任何设置或功能,但从我的理解,ObjectMapper重用JsonGenerator实例,这可能是问题吗?
以下是我的自定义序列化程序的片段...
@Override
public final void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeStartObject();
... Code here ....
jsonGenerator.writeEndObject();
closeJsonGenerator(jsonGenerator);
}
Run Code Online (Sandbox Code Playgroud)
并举例说明了它的使用方法
SimpleModule sm = new SimpleModule();
sm.addSerializer(new myCustomSerializer());
new ObjectMapper().registerModule(sm)
.writeValue(new myObject());
Run Code Online (Sandbox Code Playgroud) 我需要序列化(忽略空对象(“{}”))可以包含任何内容的非结构化对象。
从版本 2.9.X FasterXML 改变了它的工作逻辑 (Include.NON_EMPTY)。在旧版本中,它按我的需要工作。但现在它也忽略了空字符串。
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
Run Code Online (Sandbox Code Playgroud)
假设我们有下一个 java 对象(为方便起见,它看起来像一个 JSON):
{
"mapA": {},
"listA": ["",
{
"emptyString": "",
"string": "some text"
},
{}
],
"emptyString": "",
"mapB": {
"emptyString": "",
"mapC": {}
}
}
Run Code Online (Sandbox Code Playgroud)
将其转换为 JsonNode:
mapper.convertValue(/*our Object*/, JsonNode.class);
Run Code Online (Sandbox Code Playgroud)
所需的输出(再次为方便起见,它看起来像一个 JSON):
{
"listA": ["",
{
"emptyString": "",
"string": "some text"
}
],
"emptyString": "",
"mapB": {
"emptyString": ""
}
}
Run Code Online (Sandbox Code Playgroud)