Fastjson JSONField


Fastjson JSONField


1. Pengenalan JSONField


Nota: 1. Jika atribut bersifat peribadi, mesti ada kaedah set*. Jika tidak, ia tidak boleh dinyahsiri.

package com.alibaba.fastjson.annotation;

public @interface JSONField {
    // 配置序列化和反序列化的顺序,1.1.42版本之后才支持
    int ordinal() default 0;

     // 指定字段的名称
    String name() default "";

    // 指定字段的格式,对日期格式有用
    String format() default "";

    // 是否序列化
    boolean serialize() default true;

    // 是否反序列化
    boolean deserialize() default true;
}

2. Kaedah konfigurasi JSONField

FieldInfo boleh dikonfigurasikan pada kaedah atau medan getter/setter. Contohnya:

2.1 dikonfigurasikan pada getter/setter

 
 public class A {
      private int id;

      @JSONField(name="ID")
      public int getId() {return id;}
      @JSONField(name="ID")
      public void setId(int value) {this.id = id;}
 }

2.2 dikonfigurasikan pada medan

  public class A {
      @JSONField(name="ID")
      private int id;

      public int getId() {return id;}
      public void setId(int value) {this.id = id;}
 }

public class A {
      // 配置date序列化和反序列使用yyyyMMdd日期格式
      @JSONField(format="yyyyMMdd")
      public Date date;
 }

Secara lalai fastjson mensirikan kacang java, yang disiri mengikut susunan abjad Anda boleh lulus ordinal menentukan susunan medan. Ciri ini memerlukan versi 1.1.42 ke atas.

 public class A {
      @JSONField(serialize=false)
      public Date date;
 }

 public class A {
      @JSONField(deserialize=false)
      public Date date;
 }

Selepas fastjson versi 1.2.16, JSONField menyokong konfigurasi tersuai baharu bersiriUsing, yang boleh menyesuaikan pensirilan atribut tertentu kelas secara individu, seperti:

public static class VO {
   @JSONField(ordinal = 3)
   private int f0;

   @JSONField(ordinal = 2)
   private int f1;

   @JSONField(ordinal = 1)
   private int f2;
}
6. 使用serializeUsing制定属性的序列化类

Kod ujian

public static class Model {
    @JSONField(serializeUsing = ModelValueSerializer.class)
    public int value;
}

public static class ModelValueSerializer implements ObjectSerializer {
    @Override
    public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType,
                      int features) throws IOException {
        Integer value = (Integer) object;
        String text = value + "元";
        serializer.write(text);
    }
}

7. JSONField alternateNames

Fastjson menyediakan ciri yang dipinjam daripada gson dalam versi 1.2.21, yang menyokong penggunaan berbilang nama medan yang berbeza semasa penyahserilan.

Demo

Model model = new Model();
model.value = 100;
String json = JSON.toJSONString(model);
Assert.assertEquals("{\"value\":\"100元\"}", json);

8, JSONField jsonDirect

Dalam versi fastjson-1.2.12, JSONField menyokong item konfigurasi baharu jsonDirect apabila anda mempunyai medan json format data di dalam anda mahu memasukkannya secara langsung dan bukannya mengeluarkannya selepas melarikan diri.

Model

public static class Model {
    public int id;

    @JSONField(alternateNames = {"user", "person"})
    public String name;
}

String jsonVal0 = "{\"id\":5001,\"name\":\"Jobs\"}";
String jsonVal1 = "{\"id\":5382,\"user\":\"Mary\"}";
String jsonVal2 = "{\"id\":2341,\"person\":\"Bob\"}";

Model obj0 = JSON.parseObject(jsonVal0, Model.class);
assertEquals(5001, obj0.id);
assertEquals("Jobs", obj0.name);

Model obj1 = JSON.parseObject(jsonVal1, Model.class);
assertEquals(5382, obj1.id);
assertEquals("Mary", obj1.name);

Model obj2 = JSON.parseObject(jsonVal2, Model.class);
assertEquals(2341, obj2.id);
assertEquals("Bob", obj2.name);

Penggunaan

import com.alibaba.fastjson.annotation.JSONField;

public static class Model {
    public int id;
    @JSONField(jsonDirect=true)
    public String value;
}