标签: fasterxml

无法从String值('{')实例化java.util.LinkedHashMap类型的值; 没有单字符串构造函数/工厂方法

我有以下两个班级:

@JsonIgnoreProperties(ignoreUnknown = true)
public class ChangesJSON {

    @JsonProperty("changes")
    List<ChangeJSON> changes;

    @JsonProperty("more")
    Boolean more;
}

public class ChangeJSON {

    @JsonProperty("epoch")
    Long epoch;

    @JsonProperty("payload")
    Map<String, Object> payload;
}
Run Code Online (Sandbox Code Playgroud)

当我尝试使用此测试反序列化时:

String test = "{\"changes\":[{\"epoch\":1441556306522,\"payload\":\"{\"to\":1}\"},{\"epoch\":1441555481524,\"payload\":\"{\"to\":-1}\"}],\"more\":false}";

@Test
public void myTest() {
    ObjectMapper mapper = new ObjectMapper();
    ChangesJSON result = null;
    try {
        result = mapper.readValue(test, ChangesJSON.class);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    assertNotNull(result);
}
Run Code Online (Sandbox Code Playgroud)

我得到以下异常:

com.fasterxml.jackson.databind.JsonMappingException:无法从String值('{')实例化java.util.LinkedHashMap类型的值; [Source:{"changes":[{"epoch":1441556306522,"payload":"{"to":1}"},{"epoch":1441555481524,"payload"中没有单字符串构造函数/工厂方法: "{" 到 ": - 1}"}], "更多":假}; line:1,column:35](通过引用链:demo.ChangesJSON ["changes"] - > java.util.ArrayList …

java json jackson fasterxml

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

使用Jackson自定义枚举常量名称

我有一个枚举定义为

public enum Locale {
  EN_US, ES_MX
}
Run Code Online (Sandbox Code Playgroud)

但是,这些语言环境被写为带有连字符的小写字符串en-uses-mx数据.

有没有办法将这些小写字符串映射到相应的枚举常量?像en-usEN_US

编辑 让我提供更多信息.我有以下课程的对象.

public class Song {
  private Map<Locale, String> songName;
  private int durationMillis;
}
Run Code Online (Sandbox Code Playgroud)

歌曲的名称可能因Locale而异.所以我在各种Locales中创建了一个歌曲名称的地图.

我有一个包含歌曲信息的JSON文件.它读起来像:

{
  "songs": [
    {
      "songName": {"en-us":"Song name in US english", "es-mx": "Song name in Spanish"},
      "durationMillis": 100000
    },
    {
      "songName": {"en-us": "another song name -  English"},
      "durationMillis": 200000
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我定义了另一个类.

public class Songs {
  private Set<Song> songs;
}
Run Code Online (Sandbox Code Playgroud)

我使用FasterXml ObjectMapper来加载JSON作为Songs类的对象.

Songs …
Run Code Online (Sandbox Code Playgroud)

java enums jackson fasterxml

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

如何使用 Jackson 将一个 ObjectNode 作为子节点添加到另一个 ObjectNode 中?

我有下面的 ObjectNode。

handlerObjectNode -> {"Info":{"Brand":{"BrandName":"TOP OF THE WORLD"}}}
Run Code Online (Sandbox Code Playgroud)

我有另一个以下格式的 ObjectNode。

fieldObjects -> {"Description":"REGULAR BR"}
Run Code Online (Sandbox Code Playgroud)

如何从上面两个创建下面的 ObjectNode?

{
   "Info": {
       "Brand": {
           "BrandName": "TOP OF THE WORLD"
       }
   "Description": "REGULAR BR"
   }
 }
Run Code Online (Sandbox Code Playgroud)

我尝试了下面的代码。

handlerObjectNode.setAll(fieldObjects);
Run Code Online (Sandbox Code Playgroud)

但它会产生以下 ObjectNode。

{
   "Info": {
       "Brand": {
           "BrandName": "TOP OF THE WORLD"
       }
   },
   "Description": "REGULAR BR"
 }
Run Code Online (Sandbox Code Playgroud)

我正在使用 Jackson 的 com.fasterxml.jackson.databind.node.ObjectNode 。任何帮助将非常感激。

java data-binding json jackson fasterxml

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

Spring Boot 验证通过 ObjectMapper GET @RequestParam 映射的 JSON

验证在 Spring Boot 中传递到 GET REST 控制器的复杂 JSON 对象的最简单方法是什么,我正在使用com.fasterxml.jackson.databind.ObjectMapper 进行映射?

这是控制器:

@RestController
@RequestMapping("/products")
public class ProductsController {

@GetMapping
public ProductResponse getProducts(
        @RequestParam(value = "params") String requestItem
) throws IOException {
    final ProductRequest productRequest =
            new ObjectMapper()
                    .readValue(requestItem, ProductRequest.class);

    return productRetriever.getProductEarliestAvailabilities(productRequest);
}}
Run Code Online (Sandbox Code Playgroud)

我要验证的 DTO 请求对象:

public class ProductRequest {
private String productId;

public String getProductId() {
    return productId;
}

public void setProductId(String productId) {
    this.productId = productId;
}}
Run Code Online (Sandbox Code Playgroud)

我正在考虑在请求 DTO 上使用注释,但是当我这样做时,它们不会触发任何类型的异常,即@NotNull。我试着使用不同组合@Validated在控制器以及@Valid@RequestParam并没有什么原因造成的验证来触发。

java rest spring fasterxml spring-boot

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

当对象名称中包含 DOT 时,如何从 json 对象中检索字段值

我想从下面的 json 中提取“msg”值fasterxml.jackson- 谁能建议我我的模型类应该是什么样子?

{
    "statusCode": 422,
    "error": "Unprocessable Entity",
    "message": "Bad data received",
    "err_data": {
        "payment_details.type": {
            "location": "body",
            "param": "payment_details.type",
            "msg": "Must be either etransfer or cheque"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是我所做的,但它总是返回 "null" !

@JsonInclude(JsonInclude.Include.ALWAYS)
public class MyApiResponse extends ParentResponse implements Serializable {
    private static final long serialVersionUID = 1L;

    @JsonProperty("payment_details")
    private PaymentDetails payment_details;

    @JsonProperty("payment_details")
    public PaymentDetails getPayment_details() {
        return payment_details;
    }

    @JsonProperty("payment_details")
    public void setPayment_details(PaymentDetails payment_details) {
        this.payment_details = payment_details;
    }
}
Run Code Online (Sandbox Code Playgroud)

ParentResponse模型类扩展了ErrorResponse模型类,这就是它的样子.. …

json jackson rest-assured fasterxml

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

为什么 jackson 在转换为 json 时将字节数组转换为 base64 字符串?

当我在 DTO 中有一个字节数组并使用 jackson's 将其转换为 json 时ObjectMapper,它会自动将字节数组转换为 base64 字符串。下面举例。

@Data
@AllArgsConstructor
class TestDTO {
    private byte[] binaryFile;
}

class TestByteSerialization {
    public static void main(String[] args) throws Exception {
        ObjectMapper objectMapper = new ObjectMapper();
        byte[] bytes = Files.readAllBytes(new File("path/to/file/test.pdf").toPath());

        TestDTO dto = new TestDTO(bytes);

        String json = objectMapper.writeValueAsString(dto);
        System.out.println(json);
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望 jackson 将其转换为如下所示的整数数组:

{
    "binaryFile" : [21, 45, 12, 65, 12 ,37, etc]    
}
Run Code Online (Sandbox Code Playgroud)

但是相反,我发现它被转换为 base64 字符串。经过一番研究,似乎 json 不支持这里提到的字节数组。这是有道理的,因为 json 是数据的字符串表示形式。

但是我仍然找不到为什么json不支持字节数组的答案?它仍然只是一个数字数组,对吗?需要将其转换为 base64 编码的字符串吗?将字节数组按原样传递给 json …

java json jackson fasterxml

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

Jackson JsonParser 获取数组令牌

我正在使用 Jackson Json Parser 从 JSON 字符串中获取值,然后将它们插入到 Java 对象中。这是我正在处理的 JSON 的一部分:

{
    "address":"aURL",
    "links":[
        "aURL",
        "aURL",
        "aURL"
    ]
}
Run Code Online (Sandbox Code Playgroud)

这是我的 Java 代码中发生的事情。net 是一个全局的 ArrayList,Page 对象有一个 String 地址字段和一个 String[] links 字段。我想从 JSON 中获取链接的字符串数组并将它们插入到 Page 对象中。虽然我可以使用 getText() 方法轻松提取地址字符串,但我无法找到一种便捷的方法来获取字符串数组。这是我现在的代码:

private static void parse(String json) throws IOException {
    JsonParser parser = new JsonFactory().createJsonParser(json);
    while (parser.nextToken() != JsonToken.END_OBJECT) {
        String tok = parser.getCurrentName();
        Page p = new Page();
        if ("address".equals(tok)) {
            parser.nextToken();
            p.setAddress(parser.getText());
        }
        if ("links".equals(tok)) {
            parser.nextToken();
            //p.setLinks(HOW TO GET STRING ARRAY)
        }
        net.add(p); …
Run Code Online (Sandbox Code Playgroud)

java parsing json jackson fasterxml

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

Java 8 异常:com.fasterxml.jackson.datatype.jsr310.deser.InstantDeserializer 没有默认(无参数)构造函数

我有一个具有字段的模型类:

 @JsonDeserialize(using = InstantDeserializer.class)
 @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
 private OffsetDateTime offsetDt;
Run Code Online (Sandbox Code Playgroud)

当这个模型的请求发送到服务器时,我的控制器抛出异常:

Caused by: java.lang.IllegalArgumentException: 
Class com.fasterxml.jackson.datatype.jsr310.deser.InstantDeserializer 
has no default (no arg) constructor
Run Code Online (Sandbox Code Playgroud)

pom.xml 具有 2.8.11 版本的依赖项:

 <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jsr310</artifactId>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

我知道这是由 @JsonDeserialize 需要无参数构造函数引起的,但是有解决方法吗?非常感谢。

java json jackson jsr310 fasterxml

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

将 Spring Boot 从 2.4.1 升级到 2.6.1,出现 `java.time.Instant` 默认不支持错误

当我将 Spring Boot 应用程序从 2.4.1 升级到 2.6.1 时。我收到以下错误。

com.fasterxml.jackson.databind.exc.InvalidDefinitionException:java.time.Instant默认情况下不支持 Java 8 日期/时间类型:添加模块“com.fasterxml.jackson.datatype:jackson-datatype-jsr310”以启用处理(通过引用链:org. springframework.boot.actuate.trace.http.HttpTrace[“时间戳”])

java spring fasterxml spring-boot

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

使用 JacksonJsonProvider.setMapper 时无法访问 javax.ws.rs.ext.MessageBodyReader

我在升级到 spring 6 时面临无法访问 javax.ws.rs.ext.MessageBodyReader 的问题。我在 spring 6 应用程序和 com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider 2.14 中使用 glassfish jersey 3.1.0 作为 REST 服务.1.

我在调用 JacksonJsonProvider.setMapper() 时遇到此编译错误

我不知道如何解决这个问题。

spring glassfish jersey jackson fasterxml

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