1概要



FastJson


は、JSON文字列をJavaオブジェクトに、またはその逆に効果的に変換するために使用される軽量のJavaライブラリです。

この記事では、FastJsonライブラリーの具体的で実用的ないくつかのアプリケーションについて説明します。


2 Mavenの設定

FastJsonを使い始めるためには、まずそれを

pom.xml

に追加する必要があります。

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.13</version>
</dependency>

そして、ちょっとしたメモとして –

最新版はこちらです。

Maven Centralの図書館の。


3 JavaオブジェクトをJSON形式に変換

次の

Person

Java Beanを定義しましょう。

public class Person {

    @JSONField(name = "AGE")
    private int age;

    @JSONField(name = "FULL NAME")
    private String fullName;

    @JSONField(name = "DATE OF BIRTH")
    private Date dateOfBirth;

    public Person(int age, String fullName, Date dateOfBirth) {
        super();
        this.age = age;
        this.fullName= fullName;
        this.dateOfBirth = dateOfBirth;
    }

   //standard getters & setters
}

JavaオブジェクトをJSON文字列に変換するために


JSON.toJSONString()


を使用できます。

private List<Person> listOfPersons = new ArrayList<Person>();

@Before
public void setUp() {
    listOfPersons.add(new Person(15, "John Doe", new Date()));
    listOfPersons.add(new Person(20, "Janette Doe", new Date()));
}

@Test
public void whenJavaList__thanConvertToJsonCorrect() {
    String jsonOutput= JSON.toJSONString(listOfPersons);
}

そしてその結果は次のとおりです。

----[
    {
        "AGE":15,
        "DATE OF BIRTH":1468962431394,
        "FULL NAME":"John Doe"
    },
    {
        "AGE":20,
        "DATE OF BIRTH":1468962431394,
        "FULL NAME":"Janette Doe"
    }]----

さらに進んで出力のカスタマイズを開始し、

順序

、日付

フォーマット

、または

直列化

フラグなどを制御することもできます。

たとえば、Beanを更新して、さらにいくつかフィールドを追加しましょう。

@JSONField(name="AGE", serialize=false)
private int age;

@JSONField(name="LAST NAME", ordinal = 2)
private String lastName;

@JSONField(name="FIRST NAME", ordinal = 1)
private String firstName;

@JSONField(name="DATE OF BIRTH", format="dd/MM/yyyy", ordinal = 3)
private Date dateOfBirth;

変換プロセスをカスタマイズするために、


@ JSONField


アノテーションと一緒に使用できる最も基本的なパラメータのリストを次に示します。

  • パラメータ


    format


    は、

    date

    を正しくフォーマットするために使用されます。

属性
** デフォルトでは、FastJsonライブラリはJava Beanを完全にシリアル化しますが、

シリアライゼーションを無視するためにパラメータ


serialize


を使用できます。
特定のフィールド用

パラメータ


ordinal

** はフィールドの順序を指定するために使用されます

そして、これが新しい出力です。

----[    {
        "FIRST NAME":"Doe",
        "LAST NAME":"Jhon",
        "DATE OF BIRTH":"19/07/2016"
    },
    {
        "FIRST NAME":"Doe",
        "LAST NAME":"Janette",
        "DATE OF BIRTH":"19/07/2016"
    }]----

FastJsonは非常に興味深い


BeanToArray

シリアライゼーション

機能もサポートします。

String jsonOutput= JSON.toJSONString(listOfPersons, SerializerFeature.BeanToArray);

この場合の出力は次のようになります。

----[   [        15,
        1469003271063,
        "John Doe"
   ],
   [        20,
        1469003271063,
        "Janette Doe"
   ]]----

** 4 JSONオブジェクトを作成する

**


他のJSONライブラリ

のように、JSONオブジェクトを最初から作成するのは非常に簡単です。


JSONObject





JSONArray


オブジェクトを組み合わせるだけです。

@Test
public void whenGenerateJson__thanGenerationCorrect() throws ParseException {
    JSONArray jsonArray = new JSONArray();
    for (int i = 0; i < 2; i++) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("AGE", 10);
        jsonObject.put("FULL NAME", "Doe " + i);
        jsonObject.put("DATE OF BIRTH", "2016/12/12 12:12:12");
        jsonArray.add(jsonObject);
    }
    String jsonOutput = jsonArray.toJSONString();
}

そして、出力は次のようになります。

----[   {
      "AGE":"10",
      "DATE OF BIRTH":"2016/12/12 12:12:12",
      "FULL NAME":"Doe 0"
   },
   {
      "AGE":"10",
      "DATE OF BIRTH":"2016/12/12 12:12:12",
      "FULL NAME":"Doe 1"
   }]----


5 JSON文字列をJavaオブジェクトに解析する

JSONオブジェクトを最初から作成する方法、およびJavaオブジェクトをそのJSON表現に変換する方法を理解したので、次にJSON表現の解析方法に焦点を当てます。

@Test
public void whenJson__thanConvertToObjectCorrect() {
    Person person = new Person(20, "John", "Doe", new Date());
    String jsonObject = JSON.toJSONString(person);
    Person newPerson = JSON.parseObject(jsonObject, Person.class);

    assertEquals(newPerson.getAge(), 0);//if we set serialize to false
    assertEquals(newPerson.getFullName(), listOfPersons.get(0).getFullName());
}

JSON文字列からJavaオブジェクトを取得するために


JSON.parseObject()


を使用できます。

あなたがすでにあなた自身のパラメータ化されたものを宣言しているならば、

argなしまたはデフォルトコンストラクタ

を定義しなければならないことに注意してください、そうでなければ


com.alibaba.fastjson.JSONException


が投げられます。

これがこの簡単なテストの結果です。

Person[age=20, fullName=John Doe, dateOfBirth=Wed Jul 20 08:51:12 WEST 2016]----

__ @ JSONField__アノテーション内でオプション__deserialize__を使用することで、特定のフィールドの逆シリアル化を無視できます。この場合、デフォルト値が自動的に無視されたフィールドに適用されます。

[source,java,gutter:,true]

@JSONField(name = “DATE OF BIRTH”, deserialize=false)
private Date dateOfBirth;

これが新しく作成されたオブジェクトです。

[source,text,gutter:,true]

Person[age=20, fullName=John Doe, dateOfBirth=null]—-


6.

ContextValueFilter


を使用したJSON変換の設定

いくつかのシナリオでは、JavaオブジェクトからJSONフォーマットへの変換プロセスをもっと制御する必要があるかもしれません。

この場合、


ContextValueFilter


オブジェクトを利用して、追加のフィルタリングとカスタム処理を変換フローに適用できます。

@Test
public void givenContextFilter__whenJavaObject__thanJsonCorrect() {
    ContextValueFilter valueFilter = new ContextValueFilter () {
        public Object process(
          BeanContext context, Object object, String name, Object value) {
            if (name.equals("DATE OF BIRTH")) {
                return "NOT TO DISCLOSE";
            }
            if (value.equals("John")) {
                return ((String) value).toUpperCase();
            } else {
                return null;
            }
        }
    };
    String jsonOutput = JSON.toJSONString(listOfPersons, valueFilter);
}

この例では、

DATE OF BIRTHフィールドを非表示にして、定数値を強制し、

John

または

Doe以外のすべてのフィールドも無視しました。

----[    {
        "FULL NAME":"JOHN DOE",
        "DATE OF BIRTH":"NOT TO DISCLOSE"
    }]----

お分かりのように、これはかなり基本的な例ですが、より現実的なプロジェクトでFastJsonが提供するこれらの強力で軽量なツールのセットを組み合わせることで、より複雑なシナリオにも同じ概念を使用できます。


7.

NameFilter



SerializeConfig


を使用する

FastJsonは、任意のオブジェクトを扱うときにJSON操作をカスタマイズするための一連のツールを提供します – 私たちはそのソースコードを持っていません。

この記事で最初に宣言された

Person

Java Beanのコンパイル済みバージョンがあり、フィールドの命名と基本的な書式設定をいくらか強化する必要があるとしましょう。

@Test
public void givenSerializeConfig__whenJavaObject__thanJsonCorrect() {
    NameFilter formatName = new NameFilter() {
        public String process(Object object, String name, Object value) {
            return name.toLowerCase().replace(" ", "__");
        }
    };

    SerializeConfig.getGlobalInstance().addFilter(Person.class,  formatName);
    String jsonOutput =
      JSON.toJSONStringWithDateFormat(listOfPersons, "yyyy-MM-dd");
}

フィールド名を処理するために


NameFilter


匿名クラスを使用して

formatName

フィルタを宣言しました。新しく作成されたフィルタは

Person

クラスに関連付けられ、その後グローバルインスタンスに追加されます。これは基本的に


SerializeConfig


クラスの静的属性です。

これで、この記事の前半で示したように、オブジェクトを快適にJSON形式に変換できます。


toJSONString()

の代わりに


toJSONStringWithDateFormat()


を使用して、日付フィールドに同じ書式設定ルールをすばやく適用していることに注意してください。

そして、これが出力です。

----[
    {
        "full__name":"John Doe",
        "date__of__birth":"2016-07-21"
    },
    {
        "full__name":"Janette Doe",
        "date__of__birth":"2016-07-21"
    }]----

ご覧のとおり –

フィールド名は変更され

、日付値は正しくフォーマットされています。


  • SerializeFilter





    ContextValueFilter

    ** を組み合わせると、任意の複雑なJavaオブジェクトの変換プロセスを完全に制御できます。


8結論

この記事では、FastJsonを使用してJava BeanをJSON文字列に変換する方法とその逆の方法を説明しました。また、JSON出力をカスタマイズするためにFastJson



コア機能のいくつかを使用する方法も示しました。

ご覧のように、



リンクされたGitHubプロジェクト


でこの記事で提供されている例をチェックアウトすることができます。