ApexでJSONをパースする

Apex RestAPIなんかを作成している際に、インプットをJSONにしたい場合があります。
その際に受け取ったJSONをApexでパースして使用する方法がややこしかったのでメモ。

基本

基本としては、以下の記事が詳しいです。
Winter’12のJSONサポートを使いこなす(2) | チームスピリット

ここにもある通り、例えば、{a:xx, b:xxx}などのJSONがある場合は、予めapex側でそのJSONの内容専用のクラスを用意してやる必要がある、とのこと。
何もなしでいきなりパースしていくことが出来ない。

そのためにクラスを用意してオブジェクトにして……が非常にめんどくさい。

変換ツール

そんなめんどくさいJSONのクラス作成を一発で変換してくれるwebツールが以下。

JSON2Apex

例の通り、例えば以下の様なJSONを入力してapexを作成すると、以下のようなコードが生成される。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class JSON2Apex {

  public class User {
      public String name;
      public String twitter;
  }

  public User user;

  
  public static JSON2Apex parse(String json) {
      return (JSON2Apex) System.JSON.deserialize(json, JSON2Apex.class);
  }
}

そしてなんと一緒にテストコードまで出力してくれる。

1
2
3
4
5
6
7
8
9
@IsTest
public class JSON2Apex_Test {
  
  static testMethod void testParse() {
      String json = '{ ¥"user¥" : { ¥"name¥" : ¥"Simon Fell¥", ¥"twitter¥" : ¥"@superfell¥" } }';
      JSON2Apex obj = JSON2Apex.parse(json);
      System.assert(obj != null);
  }
}

これをコピペするなりしてapexクラスとして作成すればOK。

配列のJSON

以下の様な配列になっているJSONをパースしたい場合。

1
2
3
4
5
6
7
8
9
{"data":[
  {
      "userid":1,
      "name":"hoge"
  },
  {   "userid":2,
      "name":"fuga"
  }
]}    

これも上記ツールにかけると以下の様なクラスが生成される。
(テストクラスは割愛)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class JSON2Apex {

  public List<Data> data;

  public class Data {
      public Integer userid;
      public String name;
  }

  
  public static JSON2Apex parse(String json) {
      return (JSON2Apex) System.JSON.deserialize(json, JSON2Apex.class);
  }
}

これを利用してuseridを順番に取得したい場合は以下のようにすればいい。
(json_strには上記のJSONが入っているものとする)

1
2
3
4
JSON2Apex_Thread obj = JSON2Apex_Thread.parse(json_str);
for(JSON2Apex.Data val : obj.data){
    System.debug(val. userid);
}

まとめ

いちいちJSONの内容に合わせてクラスを作成しないといけないのは非常にめんどくさい。
JSON.deserializeの他にも、JSON.createParser()もあるが、これも同じくクラスの作成は必要。
型が厳密なだけにいちいち指定が必要になるのかもしれない。

参考

apex – JSON.deserialize Array of Objects – Salesforce Stack Exchange
JSONParser Class | Force.com Apex Code Developer's Guide | Salesforce Developers

   このエントリーをはてなブックマークに追加