标签: jackson-databind

如何将JSON字符串转换为Java对象的列表?

这是我的JSON数组: -

[ 
    {
        "firstName" : "abc",
        "lastName" : "xyz"
    }, 
    {
        "firstName" : "pqr",
        "lastName" : "str"
    } 
]
Run Code Online (Sandbox Code Playgroud)

我在我的String对象中有这个.现在我想将它转换为Java对象并将其存储在Java对象的List中.例如在Student对象中.我使用下面的代码将其转换为Java对象列表: -

ObjectMapper mapper = new ObjectMapper();
StudentList studentList = mapper.readValue(jsonString, StudentList.class);
Run Code Online (Sandbox Code Playgroud)

我的列表类是: -

public class StudentList {

    private List<Student> participantList = new ArrayList<Student>();

    //getters and setters
}
Run Code Online (Sandbox Code Playgroud)

我的学生对象是: -

class Student {

    String firstName;
    String lastName;

    //getters and setters
}
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么吗?我得到以下异常: -

Exception : com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of com.aa.Student out of START_ARRAY token
Run Code Online (Sandbox Code Playgroud)

java json jackson jackson-databind

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

杰克逊,用私有字段反序列化类和没有注释的arg构造函数

可以使用私有字段和自定义参数构造函数反序列化为不使用注释而不使用Jackson修改类的类?

我知道在使用这种组合时杰克逊有可能:1)Java 8,2)用"-parameters"选项编译,3)参数名称与JSON匹配.但是在没有所有这些限制的情况下,默认情况下也可以在GSON中使用.

例如:

public class Person {
    private final String firstName;
    private final String lastName;
    private final int age;

    public Person(String firstName, String lastName, int age) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }

    public static void main(String[] args) throws IOException {
        String json = "{firstName: \"Foo\", lastName: \"Bar\", age: 30}";

        System.out.println("GSON: " + deserializeGson(json)); // works fine
        System.out.println("Jackson: " + deserializeJackson(json)); // error
    }

    public static Person deserializeJackson(String json) throws IOException {
        ObjectMapper mapper = …
Run Code Online (Sandbox Code Playgroud)

java json jackson jackson2 jackson-databind

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

ObjectMapper 启用方法已弃用

我正在升级项目的版本,目前正在使用 jackson-databind-2.13.0 。但我注意到 ObjectMapper 的启用方法已被弃用。

他们说要像这样使用它。

@deprecated Since 2.13 use {@code JsonMapper.builder().enable(...)}
Run Code Online (Sandbox Code Playgroud)

但我无法使用它。

下面是我的 ObjectMapper 实例创建代码。我该如何改变?

      @Bean(name = {"objectMapper"})
      @Primary
      ObjectMapper objectMapper() {
        return newObjectMapper();
      }

  public static ObjectMapper newObjectMapper() {
    ObjectMapper objectMapper =
        new ObjectMapper()
            .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
            .configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)
            .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
            .configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true)
            .setSerializationInclusion(JsonInclude.Include.NON_NULL)
            .enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES);
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(OffsetDateTime.class, new OffsetDateTimeSerializer());
javaTimeModule.addDeserializer(OffsetDateTime.class, new OffsetDateTimeDeserializer());
javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer());
javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer());
objectMapper
    .registerModule(javaTimeModule)
    .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

return objectMapper;
Run Code Online (Sandbox Code Playgroud)

}

解决方案:

    ObjectMapper objectMapper = JsonMapper
    .builder()
    .enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES)
    .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
    .configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)
    .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, …
Run Code Online (Sandbox Code Playgroud)

java spring spring-boot objectmapper jackson-databind

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

永恒的龙目岛与杰克逊一起注释

创建类的首选方法是什么?

  • 不可变
  • 可以用Jackson序列化/反序列化
  • 人性化,低水平的样板

最好,我会喜欢这样的工作:

@Data(onConstructor = @__(@JsonCreator))
Run Code Online (Sandbox Code Playgroud)

然后有所有领域private final.但是,这甚至没有编译(我不知道为什么).运用

@AllArgsConstructor(onConstructor = @__(@JsonCreator))
Run Code Online (Sandbox Code Playgroud)

将编译,但只收益

InvalidDefinitionException: No serializer found for class
Run Code Online (Sandbox Code Playgroud)

java json jackson lombok jackson-databind

13
推荐指数
4
解决办法
7638
查看次数

龙目岛1.18.0和杰克逊2.9.6没有合作

更新后反序列化失败.

我从我的更新微服Spring 1.5.10.RELEASESpring 2.0.3.RELEASE,也更新了lombok1.16.141.18.0jackson-datatype-jsr3102.9.42.9.6.

JSON字符串 -

{"heading":"Validation failed","detail":"field must not be null"}
Run Code Online (Sandbox Code Playgroud)

班级 -

@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class ErrorDetail {

   private final String heading;
   private final String detail;
   private String type;
}
Run Code Online (Sandbox Code Playgroud)

方法调用 -

ErrorDetail errorDetail = asObject(jsonString, ErrorDetail.class);
Run Code Online (Sandbox Code Playgroud)

用于反序列化的方法 -

import com.fasterxml.jackson.databind.ObjectMapper;
// more imports and class defination.

private static <T> T asObject(final String str, Class<T> clazz) {
    try { …
Run Code Online (Sandbox Code Playgroud)

java jackson lombok spring-boot jackson-databind

13
推荐指数
2
解决办法
7999
查看次数

使用自定义消息捕获和处理Jackson异常

我希望能够捕获我正在开发的spring-boot API中发生的一些jackson异常.例如,我有以下请求类,我想捕获当JSON请求对象中的"questionnaireResponse"键为空或空白时(即" "在请求对象中)发生的错误.

@Validated
@JsonRootName("questionnaireResponse")
public class QuestionnaireResponse {

    @JsonProperty("identifier")
    @Valid
    private Identifier identifier = null;

    @JsonProperty("basedOn")
    @Valid
    private List<Identifier_WRAPPED> basedOn = null;

    @JsonProperty("parent")
    @Valid
    private List<Identifier_WRAPPED> parent = null;

    @JsonProperty("questionnaire")
    @NotNull(message = "40000")
    @Valid
    private Identifier_WRAPPED questionnaire = null;

    @JsonProperty("status")
    @NotNull(message = "40000")
    @NotEmptyString(message = "40005")
    private String status = null;

    @JsonProperty("subject")
    @Valid
    private Identifier_WRAPPED subject = null;

    @JsonProperty("context")
    @Valid
    private Identifier_WRAPPED context = null;

    @JsonProperty("authored")
    @NotNull(message = "40000")
    @NotEmptyString(message = "40005")
    @Pattern(regexp = "\\d{4}-(?:0[1-9]|[1-2]\\d|3[0-1])-(?:0[1-9]|1[0-2])T(?:[0-1]\\d|2[0-3]):[0-5]\\d:[0-5]\\dZ", message = …
Run Code Online (Sandbox Code Playgroud)

java exception-handling jackson spring-boot jackson-databind

11
推荐指数
1
解决办法
5395
查看次数

PropertyNamingStrategy.SNAKE_CASE 或 PropertyNamingStrategy.SnakeCaseStrategy 的替代方案,因为它现已弃用

在 Jackson 的早期版本中,我们在对象的序列化和反序列化期间使用以下两种方法来修改属性命名。

第一种方法:在类级别提及以下注释。

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
Run Code Online (Sandbox Code Playgroud)

第二种方法:在对象映射器本身中设置 PropertyNamingStrategy。

objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SnakeCaseStrategy.class);

or,

objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
Run Code Online (Sandbox Code Playgroud)

现在它已从 2.13 版本起被弃用。

参考: https: //fasterxml.github.io/jackson-databind/javadoc/2.13/com/fasterxml/jackson/databind/PropertyNamingStrategy.html

https://github.com/FasterXML/jackson-databind/issues/2715

现在有什么替代方案可以替代上述事情。

谁能帮我解决这个问题吗?

正在尝试上述两种方式,但现在显示已弃用。

java spring jackson spring-boot jackson-databind

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

com.fasterxml.jackson.databind.exc.MismatchedInputException:无法从START_ARRAY令牌中反序列化对象的实例

获取MismatchedInputException.在这里搜索了很多问题,但主要发现了JSONMappingException.我不明白他们是相同还是不同.

以下是实体:

@Entity
@Table
@NamedQueries({
    @NamedQuery(name="User.findAll", query="SELECT u FROM User u"),
    @NamedQuery(name="User.findByEmail", query="SELECT u FROM User u WHERE u.email=:pEmail")
})
public class User {

@Id
@GenericGenerator(name = "idGenerator", strategy = "uuid2")
@GeneratedValue(generator = "idGenerator")
private String id;
private String firstName;
private String lastName;

@Column(unique=true)
private String username;

@Column(unique=true)
private String email;
private String password;
private String role;
}
Run Code Online (Sandbox Code Playgroud)

所有的吸气剂和制定者都到位.

以下是控制器映射功能:

@RequestMapping(method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public User create(@RequestBody User user) {
        return service.create(user);
    }
Run Code Online (Sandbox Code Playgroud)

以下是服务:

@Override …
Run Code Online (Sandbox Code Playgroud)

java spring-data-jpa jackson-databind

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

在 Jackson 的 JsonDeserializer 中获取检测到的泛型类型

由于外部原因,Map我系统中的所有 java只能作为来自客户端的键值对列表接收,例如 aMap<String, Book>实际上将作为 Json-serialized 接收List<MapEntry<String, Book>>。这意味着我需要自定义我的 Json 反序列化过程以期望这种地图表示。

问题是JsonDeserializer让我实施

deserialize(JsonParser p, DeserializationContext ctxt)
Run Code Online (Sandbox Code Playgroud)

无法访问检测到的应该反序列化的泛型类型的方法(Map<String, Book>在上面的示例中)。如果没有这些信息,我将无法在List<MapEntry<String, Book>>不失去类型安全性的情况下反序列化。

我正在查看Converter但它提供的上下文更少。

例如

public Map<K,V> convert(List<MapToListTypeAdapter.MapEntry<K,V>> list) {
    Map<K,V> x = new HashMap<>();
    list.forEach(entry -> x.put(entry.getKey(), entry.getValue()));
    return x;
}
Run Code Online (Sandbox Code Playgroud)

但这可能会创建危险的映射,ClassCastException在检索时会抛出异常,因为无法检查类型是否实际合理。有没有办法解决这个问题?

作为我期望的一个例子,GsonJsonDeserializer看起来像这样:

T deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
Run Code Online (Sandbox Code Playgroud)

即它以一种理智的方式提供对预期类型的​​访问。

java generics json jackson jackson-databind

10
推荐指数
1
解决办法
2335
查看次数

无法从字符串反序列化类型为java.util.Date的值

使用Spring 1.5.8.RELEASE Jackson映射器给出以下异常。

Cannot deserialize value of type `java.util.Date` from String "2018-09-04T10:44:46": expected format "yyyy-MM-dd'T'HH:mm:ss.SSS"
Run Code Online (Sandbox Code Playgroud)

在[资料来源:未知;行:-1,列:-1](通过参考链:com.copart.conversationapi.calldisposition.model.vo.CallLogEntity [“ callEndTime”])

CallEntity.java

@JsonProperty("callEndTime")
@Column(name = "call_end_ts")
@JsonFormat(pattern="yyyy-MM-dd'T'HH:mm:ss.SSS")
private Date callEndTime;
Run Code Online (Sandbox Code Playgroud)

DAO.java

ObjectMapper mapper = new ObjectMapper();
HashMap<String, Object> finalHashMap;
finalHashMap = convertMultiToString(requestMap);
mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
CallLogEntity callLogEntity = mapper.convertValue(finalHashMap, CallEntity.class);
Run Code Online (Sandbox Code Playgroud)

pom.xml

<dependency>
     <groupId>com.fasterxml.jackson.core</groupId>
     <artifactId>jackson-databind</artifactId>
     <version>2.9.0</version>
     <exclusions>
        <exclusion>
           <groupId>com.fasterxml.jackson.core</groupId>
           <artifactId>jackson-core</artifactId>
        </exclusion>
        <exclusion>
           <groupId>com.fasterxml.jackson.core</groupId>
           <artifactId>jackson-annotations</artifactId>
        </exclusion>
     </exclusions>
  </dependency>
Run Code Online (Sandbox Code Playgroud)

java spring-mvc jackson spring-boot jackson-databind

10
推荐指数
1
解决办法
8114
查看次数