标签: fasterxml

无法解析具有属性的元素列表

我有对象链接有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)

java xml jackson fasterxml

4
推荐指数
1
解决办法
2874
查看次数

是否有可能使用具有纳秒值的杰克逊

在从对象解析为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.390452user.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)

java datetime json jackson fasterxml

4
推荐指数
1
解决办法
3996
查看次数

使用FasterXML Jackson将String转换为Integer

我正在消耗两个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,以便轻松比较这两个属性?

java json jackson fasterxml

4
推荐指数
1
解决办法
4670
查看次数

Fasterxml ObjectMapper:日期解析 - 意外字符('-'(代码 45))

杰森:

{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 字符串中的日期值时,相同的代码可以正常工作。

java json fasterxml

4
推荐指数
1
解决办法
2万
查看次数

如何克服“属性设置器定义冲突”?

我使用com.fasterxml.jacksonio.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)

json jackson swagger fasterxml swagger-2.0

4
推荐指数
1
解决办法
1万
查看次数

带有Maven的com / fasterxml / jackson / databind / ObjectMapper的NoClassDefFoundError

这是一个与此处类似的问题,遗憾的是尚未解决。

如果您想调试代码,请参见GitHub repo

尽管我已将相关的依赖项添加到Mave中NoClassDefFoundErrorObjectMapper但得到了以下内容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)

java jackson maven fasterxml

4
推荐指数
2
解决办法
1万
查看次数

JAVA - 使用 FasterXml.Jackson 将 XML 文件解析为 Map

我有以下 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

java xml jackson fasterxml

4
推荐指数
1
解决办法
8891
查看次数

Jackson ObjectMapper 的日期和时间戳序列化

默认情况下,JacksonObjectMapperDate和序列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&转换TimeStampFormatted 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(即使它有效),因为它也将用于输入日期格式不同的反序列化。

有办法实现这一点吗?

java serialization scala jackson fasterxml

4
推荐指数
1
解决办法
1万
查看次数

Jackson ObjectMapper和JsonGenerator - 它是线程安全的吗?

我目前有一个项目使用jackson rapid xml来使用自定义序列化器和反序列化器将POJO序列化/反序列化为Json.据我所知,ObjectMapper一旦创建和配置就是线程安全的.但是,我注意到在使用JMeter运行测试时偶尔会发生以下情况 -

  • 线程1进入CustomerSerializer并开始序列化
  • 线程2进入CustomSerializer,中断线程1,并开始从头到尾序列化
  • 线程1恢复,最后被序列化的东西丢失了

似乎第二个线程进入时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)

java json fasterxml

3
推荐指数
1
解决办法
6334
查看次数

如何在 ObjectMapper 中忽略空对象“{}”而不是空字符串?

我需要序列化(忽略空对象(“{}”))可以包含任何内容的非结构化对象。

从版本 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)

java json jackson fasterxml

3
推荐指数
1
解决办法
1475
查看次数

标签 统计

fasterxml ×10

java ×9

jackson ×8

json ×6

xml ×2

datetime ×1

maven ×1

scala ×1

serialization ×1

swagger ×1

swagger-2.0 ×1