목차
01. Jackson 종속성을 소개합니다
02. ObjectMapper 사용
03、更高级的配置
04、处理日期格式
05、字段过滤
06、自定义序列化和反序列化
07、结语
Java Java베이스 내가 생각하는 최고의 Java JSON 파서: Jackson

내가 생각하는 최고의 Java JSON 파서: Jackson

Dec 16, 2020 am 09:48 AM
java 후방

Java 기본 튜토리얼이 칼럼에서는 Java JSON 파서를 소개합니다

내가 생각하는 최고의 Java JSON 파서: Jackson

권장(무료): Java 기본 튜토리얼

오늘날의 프로그래밍 세계에서 JSON은 정보가 되었습니다. 선호하는 프로토콜 클라이언트에서 서버로의 전송을 위해 XML이 해변에서 총에 맞아 죽었다고해도 과언이 아닙니다.

안타깝게도 JDK에는 JSON 라이브러리가 없는데 왜 개발되지 않는지 모르겠습니다. Log4j 당시 java.util.logging도 경쟁을 위해 출시되었지만 결국 사용하는 사람은 많지 않았습니다.

Java가 뛰어난 이유는 생태계가 매우 완벽하기 때문입니다. JDK에는 JSON 라이브러리가 없지만 제3자 라이브러리에는 꽤 좋습니다. 예를 들어 이 기사의 돼지 발 - Jackson, GitHub 위첨자. star 6.1k, Spring Boot의 기본 JSON 파서.

이것을 어떻게 증명할 수 있나요?

스타터를 통해 새로운 Spring Boot 웹 프로젝트를 생성하면 Maven 종속성에서 Jackson을 볼 수 있습니다.

내가 생각하는 최고의 Java JSON 파서: Jackson

Jackson에는 다음과 같은 많은 장점이 있습니다.

  • 대용량 파일을 더 빠르게 구문 분석합니다.
  • 런타임 중에 메모리를 덜 차지하고 성능이 더 좋습니다.
  • API는 매우 유연하고 확장 및 사용자 정의가 쉽습니다.

Jackson의 핵심 모듈은 세 부분으로 구성됩니다.

  • 핵심 패키지인 jackson-core는 JsonPaser 및 JsonGenerator를 포함하여 "스트림 모드" 구문 분석을 기반으로 관련 API를 제공합니다.
  • jackson-annotations, 주석 패키지는 표준 주석 기능을 제공합니다.
  • jackson-databind, 데이터 바인딩 패키지는 "객체 바인딩" 구문 분석(ObjectMapper) 기반 관련 API와 "트리 모델" 구문 분석(JsonNode) 기반 관련 API를 제공합니다. .

01. Jackson 종속성을 소개합니다

Jackson을 사용하려면 pom.xml 파일에 Jackson 종속성을 추가해야 합니다.

<dependency>
    <groupid>com.fasterxml.jackson.core</groupid>
    <artifactid>jackson-databind</artifactid>
    <version>2.10.1</version>
</dependency>
로그인 후 복사

jackson-databind는 jackson-core 및 jackson-annotations에 의존하므로 jackson-databind를 추가한 후 Maven은 자동으로 jackson-core 및 jackson-annotations를 프로젝트에 도입합니다.

내가 생각하는 최고의 Java JSON 파서: Jackson

Maven의 가장 큰 장점은 우리가 해야 할 일을 비밀리에 도와줄 수 있다는 것입니다.

02. ObjectMapper 사용

Jackson에서 가장 일반적으로 사용되는 API는 일련의 writeValue 메소드를 통해 Java 객체를 JSON으로 직렬화하고 다양한 형식으로 저장할 수 있는 "객체 바인딩" 기반의 ObjectMapper입니다.

  • writeValueAsString(Object value) 메서드, 개체를 문자열로 저장 writeValueAsString(Object value) 方法,将对象存储成字符串
  • writeValueAsBytes(Object value) 方法,将对象存储成字节数组
  • writeValue(File resultFile, Object value) 方法,将对象存储成文件

来看一下存储成字符串的代码示例:

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

/**
 * 微信搜索「沉默王二」,回复 Java
 *
 * @author 沉默王二
 * @date 2020/11/26
 */
public class Demo {
    public static void main(String[] args) throws JsonProcessingException {
        Writer wanger = new Writer("沉默王二", 18);
        ObjectMapper mapper = new ObjectMapper();
        String jsonString = mapper.writerWithDefaultPrettyPrinter()
                .writeValueAsString(wanger);
        System.out.println(jsonString);
    }
}

class Writer {
    private String name;
    private int age;

    public Writer(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
로그인 후 복사

程序输出结果如下所示:

{
  "name" : "沉默王二",
  "age" : 18
}
로그인 후 복사

不是所有的字段都支持序列化和反序列化,需要符合以下规则:

  • 如果字段的修饰符是 public,则该字段可序列化和反序列化(不是标准写法)。
  • 如果字段的修饰符不是 public,但是它的 getter 方法和 setter 方法是 public,则该字段可序列化和反序列化。getter 方法用于序列化,setter 方法用于反序列化。
  • 如果字段只有 public 的 setter 方法,而无 public 的 getter 方 法,则该字段只能用于反序列化。

如果想更改默认的序列化和反序列化规则,需要调用 ObjectMapper 的 setVisibility() 方法。否则将会抛出 InvalidDefinitionException 异常。

ObjectMapper 通过 readValue 的系列方法从不同的数据源将 JSON 反序列化为 Java 对象。

  • readValue(String content, Class<t> valueType)</t> 方法,将字符串反序列化为 Java 对象
  • readValue(byte[] src, Class<t> valueType)</t> 方法,将字节数组反序列化为 Java 对象
  • readValue(File src, Class<t> valueType)</t> 方法,将文件反序列化为 Java 对象

来看一下将字符串反序列化为 Java 对象的代码示例:

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

/**
 * 微信搜索「沉默王二」,回复 Java
 *
 * @author 沉默王二
 * @date 2020/11/26
 */
public class Demo {
    public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        String jsonString = "{\n" +
                "  \"name\" : \"沉默王二\",\n" +
                "  \"age\" : 18\n" +
                "}";
        Writer deserializedWriter = mapper.readValue(jsonString, Writer.class);
        System.out.println(deserializedWriter);
    }
}

class Writer{
    private String name;
    private int age;

    // getter/setter

    @Override
    public String toString() {
        return "Writer{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
로그인 후 복사

程序输出结果如下所示:

Writer{name='沉默王二', age=18}
로그인 후 복사

PS:如果反序列化的对象有带参的构造方法,它必须有一个空的默认构造方法,否则将会抛出 InvalidDefinitionException

writeValueAsBytes(Object value) 메서드, 개체를 바이트 배열로 저장

writeValue(파일 결과파일, 개체 값) 메서드, 개체를 파일로 저장

🎜문자열로 저장하는 코드 예제를 살펴보겠습니다.🎜
Exception in thread "main" com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.itwanger.jackson.Writer` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
 at [Source: (String)"{
  "name" : "沉默王二",
  "age" : 18
}"; line: 2, column: 3]
    at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67)
    at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1589)
    at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1055)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1297)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:326)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:159)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4202)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3205)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3173)
    at com.itwanger.jackson.Demo.main(Demo.java:19)
로그인 후 복사
🎜프로그램 출력은 다음과 같습니다.🎜
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

/**
 * 微信搜索「沉默王二」,回复 Java
 *
 * @author 沉默王二
 * @date 2020/11/26
 */
public class JsonNodeDemo {
    public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        String json = "{ \"name\" : \"沉默王二\", \"age\" : 18 }";
        JsonNode jsonNode = mapper.readTree(json);
        String name = jsonNode.get("name").asText();
        System.out.println(name); // 沉默王二
    }
}
로그인 후 복사
로그인 후 복사
🎜모든 필드가 직렬화 및 역직렬화를 지원하는 것은 아니며 다음 규칙을 준수해야 합니다. 🎜🎜🎜필드의 수정자가 공개인 경우 필드를 직렬화 및 역직렬화할 수 있습니다(표준 작성 방법 아님). 🎜🎜필드의 수정자가 공개되지 않았지만 해당 getter 및 setter 메서드가 공개된 경우 필드를 직렬화 및 역직렬화할 수 있습니다. getter 메소드는 직렬화에 사용되고 setter 메소드는 deserialization에 사용됩니다. 🎜🎜필드에 공개 setter 메서드만 있고 공개 getter 메서드가 없는 경우 해당 필드는 역직렬화에만 사용할 수 있습니다. 🎜🎜🎜기본 직렬화 및 역직렬화 규칙을 변경하려면 ObjectMapper의 setVisibility() 메서드를 호출해야 합니다. 그렇지 않으면 InvalidDefinitionException이 발생합니다. 🎜🎜ObjectMapper는 readValue 일련의 메소드를 통해 JSON을 다양한 데이터 소스의 Java 객체로 역직렬화합니다. 🎜🎜🎜readValue(String content, Class<t> valueType)</t> 메서드는 문자열을 Java 객체로 역직렬화합니다🎜🎜readValue(byte[] src, Class valueType) code> 메소드는 바이트 배열을 Java 객체🎜🎜readValue(File src, Class<t> valueType)</t> 메소드로 역직렬화하고 파일을 Java 객체🎜🎜🎜로 역직렬화합니다. 코드를 살펴보세요 문자열을 Java 객체로 역직렬화하는 예: 🎜
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.util.List;

/**
 * 微信搜索「沉默王二」,回复 Java
 *
 * @author 沉默王二
 * @date 2020/11/26
 */
public class TypeReferenceDemo {
    public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        String json = "[{ \"name\" : \"沉默王三\", \"age\" : 18 }, { \"name\" : \"沉默王二\", \"age\" : 19 }]";
        List<author> listAuthor = mapper.readValue(json, new TypeReference<list>>(){});
        System.out.println(listAuthor);
    }
}
class Author{
    private String name;
    private int age;

    // getter/setter

    // toString
}</list></author>
로그인 후 복사
로그인 후 복사
🎜프로그램 출력은 다음과 같습니다. 🎜
String jsonString = "{\n" +
                "  \"name\" : \"沉默王二\",\n" +
                "  \"age\" : 18\n" +
                "  \"sex\" : \"男\",\n" +
                "}";
로그인 후 복사
로그인 후 복사
🎜PS: 역직렬화된 객체에 매개변수가 있는 생성자가 있는 경우 빈 기본 생성자가 있어야 하며, 그렇지 않으면 InvalidDefinitionException 줄이 표시됩니다. 🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">class Writer{     private String name;     private int age;     // getter/setter }</pre><div class="contentsignin">로그인 후 복사</div></div><div class="contentsignin">로그인 후 복사</div></div>🎜Jackson에서 가장 일반적으로 사용되는 API는 "객체 바인딩"을 기반으로 하는 ObjectMapper입니다. 🎜🎜ObjectMapper는 JSON을 "트리 모델"을 기반으로 JsonNode 객체로 구문 분석할 수도 있습니다. 🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; /**  * 微信搜索「沉默王二」,回复 Java  *  * @author 沉默王二  * @date 2020/11/26  */ public class JsonNodeDemo {     public static void main(String[] args) throws JsonProcessingException {         ObjectMapper mapper = new ObjectMapper();         String json = &quot;{ \&quot;name\&quot; : \&quot;沉默王二\&quot;, \&quot;age\&quot; : 18 }&quot;;         JsonNode jsonNode = mapper.readTree(json);         String name = jsonNode.get(&quot;name&quot;).asText();         System.out.println(name); // 沉默王二     } }</pre><div class="contentsignin">로그인 후 복사</div></div><div class="contentsignin">로그인 후 복사</div></div> <p>借助 TypeReference 可以将 JSON 字符串数组转成泛型 List,来看下面的示例:</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.List; /**  * 微信搜索「沉默王二」,回复 Java  *  * @author 沉默王二  * @date 2020/11/26  */ public class TypeReferenceDemo {     public static void main(String[] args) throws JsonProcessingException {         ObjectMapper mapper = new ObjectMapper();         String json = &quot;[{ \&quot;name\&quot; : \&quot;沉默王三\&quot;, \&quot;age\&quot; : 18 }, { \&quot;name\&quot; : \&quot;沉默王二\&quot;, \&quot;age\&quot; : 19 }]&quot;;         List&lt;author&gt; listAuthor = mapper.readValue(json, new TypeReference&lt;list&gt;&gt;(){});         System.out.println(listAuthor);     } } class Author{     private String name;     private int age;     // getter/setter     // toString }&lt;/list&gt;&lt;/author&gt;</pre><div class="contentsignin">로그인 후 복사</div></div><div class="contentsignin">로그인 후 복사</div></div> <h3 id="更高级的配置">03、更高级的配置</h3> <p>Jackson 之所以牛掰的一个很重要的因素是可以实现高度灵活的自定义配置。</p> <p>在实际的应用场景中,JSON 中常常会有一些 Java 对象中没有的字段,这时候,如果直接解析的话,会抛出 UnrecognizedPropertyException 异常。</p> <p>下面是一串 JSON 字符串:</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">String jsonString = &quot;{\n&quot; +                 &quot;  \&quot;name\&quot; : \&quot;沉默王二\&quot;,\n&quot; +                 &quot;  \&quot;age\&quot; : 18\n&quot; +                 &quot;  \&quot;sex\&quot; : \&quot;男\&quot;,\n&quot; +                 &quot;}&quot;;</pre><div class="contentsignin">로그인 후 복사</div></div><div class="contentsignin">로그인 후 복사</div></div> <p>但 Java 对象 Writer 中没有定义 sex 字段:</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">class Writer{     private String name;     private int age;     // getter/setter }</pre><div class="contentsignin">로그인 후 복사</div></div><div class="contentsignin">로그인 후 복사</div></div> <p>我们来尝试解析一下:</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">ObjectMapper mapper = new ObjectMapper(); Writer deserializedWriter = mapper.readValue(jsonString, Writer.class);</pre><div class="contentsignin">로그인 후 복사</div></div> <p>不出意外,抛出异常了,sex 无法识别。</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">Exception in thread &quot;main&quot; com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field &quot;sex&quot; (class com.itwanger.jackson.Writer), not marked as ignorable (2 known properties: &quot;name&quot;, &quot;age&quot;])  at [Source: (String)&quot;{   &quot;name&quot; : &quot;沉默王二&quot;,   &quot;age&quot; : 18,   &quot;sex&quot; : &quot;男&quot; }&quot;; line: 4, column: 12] (through reference chain: com.itwanger.jackson.Writer[&quot;sex&quot;])</pre><div class="contentsignin">로그인 후 복사</div></div> <p>怎么办呢?可以通过 <code>configure() 方法忽略掉这些“无法识别”的字段。

mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
로그인 후 복사

除此之外,还有其他一些有用的配置信息,来了解一下:

// 在序列化时忽略值为 null 的属性
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
// 忽略值为默认值的属性
mapper.setDefaultPropertyInclusion(JsonInclude.Include.NON_DEFAULT);
로그인 후 복사

04、处理日期格式

对于日期类型的字段,比如说 java.util.Date,如果不指定格式,序列化后将显示为 long 类型的数据,这种默认格式的可读性很差。

{
  "age" : 18,
  "birthday" : 1606358621209
}
로그인 후 복사

怎么办呢?

第一种方案,在 getter 上使用 @JsonFormat 注解。

private Date birthday;

// GMT+8 是指格林尼治的标准时间,在加上八个小时表示你现在所在时区的时间
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
public Date getBirthday() {
    return birthday;
}

public void setBirthday(Date birthday) {
    this.birthday = birthday;
}
로그인 후 복사

再来看一下结果:

{
  "age" : 18,
  "birthday" : "2020-11-26 03:02:30"
}
로그인 후 복사

具体代码如下所示:

ObjectMapper mapper = new ObjectMapper();
Writer wanger = new Writer("沉默王二", 18);
wanger.setBirthday(new Date());
String jsonString = mapper.writerWithDefaultPrettyPrinter()
                .writeValueAsString(wanger);
System.out.println(jsonString);
로그인 후 복사

第二种方案,调用 ObjectMapper 的 setDateFormat() 方法。

ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(StdDateFormat.getDateTimeInstance());
Writer wanger = new Writer("沉默王二", 18);
wanger.setBirthday(new Date());
String jsonString = mapper.writerWithDefaultPrettyPrinter()
                .writeValueAsString(wanger);
System.out.println(jsonString);
로그인 후 복사

输出结果如下所示:

{
  "name" : "沉默王二",
  "age" : 18,
  "birthday" : "2020年11月26日 上午11:09:51"
}
로그인 후 복사

05、字段过滤

在将 Java 对象序列化为 JSON 时,可能有些字段需要过滤,不显示在 JSON 中,Jackson 有一种比较简单的实现方式。

@JsonIgnore 用于过滤单个字段。

@JsonIgnore
public String getName() {
    return name;
}
로그인 후 복사

@JsonIgnoreProperties 用于过滤多个字段。

@JsonIgnoreProperties(value = { "age","birthday" })
class Writer{
    private String name;
    private int age;
    private Date birthday;
}
로그인 후 복사

06、自定义序列化和反序列化

当 Jackson 默认序列化和反序列化不能满足实际的开发需要时,可以自定义新的序列化和反序列化类。

自定义的序列化类需要继承 StdSerializer,同时重写 serialize() 方法,利用 JsonGenerator 生成 JSON,示例如下:

/**
 * 微信搜索「沉默王二」,回复 Java
 *
 * @author 沉默王二
 * @date 2020/11/26
 */
public class CustomSerializer extends StdSerializer<man> {
    protected CustomSerializer(Class<man> t) {
        super(t);
    }

    public CustomSerializer() {
        this(null);
    }

    @Override
    public void serialize(Man value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        gen.writeStartObject();
        gen.writeStringField("name", value.getName());
        gen.writeEndObject();
    }
}

class Man{
    private int age;
    private String name;

    public Man(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}</man></man>
로그인 후 복사

定义好自定义序列化类后,要想在程序中调用它们,需要将其注册到 ObjectMapper 的 Module 中,示例如下所示:

ObjectMapper mapper = new ObjectMapper();
SimpleModule module =
        new SimpleModule("CustomSerializer", new Version(1, 0, 0, null, null, null));
module.addSerializer(Man.class, new CustomSerializer());
mapper.registerModule(module);
Man man = new Man( 18,"沉默王二");
String json = mapper.writeValueAsString(man);
System.out.println(json);
로그인 후 복사

程序输出结果如下所示:

{"name":"沉默王二"}
로그인 후 복사

自定义序列化类 CustomSerializer 中没有添加 age 字段,所以只输出了 name 字段。

再来看一下自定义的反序列化类,继承 StdDeserializer,同时重写 deserialize() 方法,利用 JsonGenerator 读取 JSON,示例如下:

public class CustomDeserializer extends StdDeserializer<woman> {
    protected CustomDeserializer(Class> vc) {
        super(vc);
    }

    public CustomDeserializer() {
        this(null);
    }

    @Override
    public Woman deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        JsonNode node = p.getCodec().readTree(p);
        Woman woman = new Woman();
        int age = (Integer) ((IntNode) node.get("age")).numberValue();
        String name = node.get("name").asText();
        woman.setAge(age);
        woman.setName(name);
        return woman;
    }
}
class Woman{
    private int age;
    private String name;

    public Woman() {
    }

    // getter/setter

    @Override
    public String toString() {
        return "Woman{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}</woman>
로그인 후 복사

通过 JsonNode 把 JSON 读取到一个树形结构中,然后通过 JsonNode 的 get 方法将对应字段读取出来,然后生成新的 Java 对象,并返回。

定义好自定义反序列化类后,要想在程序中调用它们,同样需要将其注册到 ObjectMapper 的 Module 中,示例如下所示:

ObjectMapper mapper = new ObjectMapper();
SimpleModule module =
        new SimpleModule("CustomDeserializer", new Version(1, 0, 0, null, null, null));
module.addDeserializer(Woman.class, new CustomDeserializer());
mapper.registerModule(module);
String json = "{ \"name\" : \"三妹\", \"age\" : 18 }";
Woman woman = mapper.readValue(json, Woman.class);
System.out.println(woman);
로그인 후 복사

程序输出结果如下所示:

Woman{age=18, name='三妹'}
로그인 후 복사

07、结语

哎呀,好像不错哦,Jackson 绝对配得上“最牛掰”这三个字,虽然有点虚。如果只想简单的序列化和反序列化,使用 ObjectMapper 的 write 和 read 方法即可。

如果还想更进一步的话,就需要对 ObjectMapper 进行一些自定义配置,或者加一些注解,以及直接自定义序列化和反序列化类,更贴近一些 Java 对象。

需要注意的是,对日期格式的字段要多加小心,尽量不要使用默认配置,可读性很差。

好了,通过这篇文章的系统化介绍,相信你已经完全摸透 Jackson 了,我们下篇文章见。

PS:如果你恰好需要一份 Java 精进路线的话,我这里有一份,我差不多花了 3 天的时间整理的,还挺受欢迎的,已经 2000 多赞了,每个阶段都很详细。

相关免费学习推荐:php编程(视频)

위 내용은 내가 생각하는 최고의 Java JSON 파서: Jackson의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

자바의 제곱근 자바의 제곱근 Aug 30, 2024 pm 04:26 PM

자바의 제곱근 안내 여기서는 예제와 코드 구현을 통해 Java에서 Square Root가 어떻게 작동하는지 설명합니다.

자바의 완전수 자바의 완전수 Aug 30, 2024 pm 04:28 PM

Java의 완전수 가이드. 여기서는 정의, Java에서 완전 숫자를 확인하는 방법, 코드 구현 예제에 대해 논의합니다.

Java의 난수 생성기 Java의 난수 생성기 Aug 30, 2024 pm 04:27 PM

Java의 난수 생성기 안내. 여기서는 예제를 통해 Java의 함수와 예제를 통해 두 가지 다른 생성기에 대해 설명합니다.

자바의 웨카 자바의 웨카 Aug 30, 2024 pm 04:28 PM

Java의 Weka 가이드. 여기에서는 소개, weka java 사용 방법, 플랫폼 유형 및 장점을 예제와 함께 설명합니다.

Java의 스미스 번호 Java의 스미스 번호 Aug 30, 2024 pm 04:28 PM

Java의 Smith Number 가이드. 여기서는 정의, Java에서 스미스 번호를 확인하는 방법에 대해 논의합니다. 코드 구현의 예.

Java Spring 인터뷰 질문 Java Spring 인터뷰 질문 Aug 30, 2024 pm 04:29 PM

이 기사에서는 가장 많이 묻는 Java Spring 면접 질문과 자세한 답변을 보관했습니다. 그래야 면접에 합격할 수 있습니다.

Java 8 Stream foreach에서 나누거나 돌아 오시겠습니까? Java 8 Stream foreach에서 나누거나 돌아 오시겠습니까? Feb 07, 2025 pm 12:09 PM

Java 8은 스트림 API를 소개하여 데이터 컬렉션을 처리하는 강력하고 표현적인 방법을 제공합니다. 그러나 스트림을 사용할 때 일반적인 질문은 다음과 같은 것입니다. 기존 루프는 조기 중단 또는 반환을 허용하지만 스트림의 Foreach 메소드는이 방법을 직접 지원하지 않습니다. 이 기사는 이유를 설명하고 스트림 처리 시스템에서 조기 종료를 구현하기위한 대체 방법을 탐색합니다. 추가 읽기 : Java Stream API 개선 스트림 foreach를 이해하십시오 Foreach 메소드는 스트림의 각 요소에서 하나의 작업을 수행하는 터미널 작동입니다. 디자인 의도입니다

Java의 날짜까지의 타임스탬프 Java의 날짜까지의 타임스탬프 Aug 30, 2024 pm 04:28 PM

Java의 TimeStamp to Date 안내. 여기서는 소개와 예제와 함께 Java에서 타임스탬프를 날짜로 변환하는 방법에 대해서도 설명합니다.

See all articles