FastJSONガイド


FastJSONガイド
FastJSONは軽量レベルのJavaオブジェクトとJSON文字列が互いに変換されるライブラリであり、この文章ではFastJSONの概念をいくつか述べ、実際にFastJSONの応用を実証する.
Mavenの設定
<dependency>
    <groupId>com.alibabagroupId>
    <artifactId>fastjsonartifactId>
    <version>1.2.13version>
dependency>

JavaオブジェクトをJSON文字列に変換
このような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
}

なお、注記@JSOnFieldは、FastJSONがJavaオブジェクトを文字列に変換する際に用いるキー名を示す.
JSON.toJSOnString()を呼び出すことで、JavaオブジェクトをJSON文字列に変換できます.
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);
}

まずPersonクラスのリストを作成し,2つのPersonオブジェクトを含み,次いでそれらをJSON文字列に変換した.
[  
    {  
        "AGE":15,
        "DATE OF BIRTH":1468962431394,
        "FULL NAME":"John Doe"
    },
    {  
        "AGE":20,
        "DATE OF BIRTH":1468962431394,
        "FULL NAME":"Janette Doe"
    }
]

フィールド名は、Bean定義で注記@JSOnFieldで指定されているものと同じで、指定されていない場合はデフォルトでBeanで定義されている名前が使用されます.
@JSOnField注記の役割はこれだけではなく、日付のフォーマットを定義することもできます.このフィールドが文字列に変換されているかどうか、この文字列がJSONでの順序などです.たとえば、先ほどのPersonクラスをこのように変更することができます.
@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;

私達はageフィールドに対してシーケンス化しないことを設定して、だからそれは変換した文字列の中で現れないで、各フィールドの順序を設定して、先から後までfirstName、lastName、dateOfBirthで、私達の今得る出力は
[
    {
        "FIRST NAME":"Doe",
        "LAST NAME":"Jhon",
        "DATE OF BIRTH":"19/07/2016"
    },
    {
        "FIRST NAME":"Doe",
        "LAST NAME":"Janette",
        "DATE OF BIRTH":"19/07/2016"
    }
]

JSONObjectsオブジェクトの作成
FastJsonでは、2つの重要なオブジェクトクラスがあります.1つはJSOnObjectで、もう1つはJSOnArrayです.この2つはそれぞれjsonのオブジェクトとリストに対応しています.下位実装はmapとlistです.
この2つのオブジェクトがどのように構成されているかを見ることができます
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();
}

ここではJSOnArrayを作成し、そこに2つのJSOnObjectオブジェクトを追加した.この2つのオブジェクトはput()メソッドでフィールドを追加した.なお、JSOBObjectの下位データ構造はmapであるため、putとgetメソッドでデータをアクセスすることができるが、インデックスでのランダムアクセスはサポートされず、JSOBObjectのキー規定はStringタイプであり、値には特定の要求はない.
得られた文字列は次のとおりです.
[
   {
      "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"
   }
]

JSON文字列をJavaオブジェクトに変換
JavaオブジェクトをJSON文字列に変換する方法と、JSON文字列を作成する方法を知っています.JSON文字列をJavaオブジェクトに変換する方法を見てみましょう.
最も簡単なのは、Javaオブジェクトを作成した場合、JSONのparseObjectメソッドを直接呼び出すことができます.
Person person = new Person(20, "John", "Doe", new Date());
String jsonObject = JSON.toJSONString(person);
Person newPerson = JSON.parseObject(jsonObject, Person.class);

parseObjectメソッドを使用する場合は、マッピングするオブジェクトを指定するためにclassオブジェクトを入力する必要があります.
オブジェクトを事前に定義していない場合は、文字列のみを入力してJSOnObjectオブジェクトで受信できます.
JSONObject object = JSON.parseObject(jsonOutput);

前述したようにJSONObjectの下位実装はmapであるため,getメソッドでフィールド名を入力して属性を取得することができ,FastJSONはあらかじめ複数のgetメソッドを定義している.
        Integer i = object.getInteger("AGE");
        String s = object.getString("FULL NAME");
        JSONObject jo = object.getJSONObject("sth");
        JSONArray ja = object.getJSONArray("sth2");

基本タイプ、例えばintを取得すると、対応するパッケージクラスメソッドの後にValueを加えるだけでいいです.例えば、object.getIntegerメソッドはIntegerを返し、object.getIntegerValueはintタイプを返します.