Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

GroovyでJSON2015

2015/3/13「JSON日の金曜日」で発表した内容です。

  • Identifiez-vous pour voir les commentaires

GroovyでJSON2015

  1. 1. 速水 康晴
  2. 2.  速水 康晴(はやみ やすはる)  新潟県新潟市西区在住  ウイングアーク1st株式会社 新潟オフィス ◦ プログラマ(アーキテクト):Java/Flex/ActionScript  JGGUG(日本Grails/Groovyユーザーグループ) ◦ サポート・スタッフ  E-mail:toby55kij@gmail.com  Twitter:toby55kij 22015-3-13
  3. 3.  Groovyの今  GroovyでJSONを扱う  Groovy2.3(以降)での変更点  JsonSlurperのtypeについて 2015-3-13 3
  4. 4.  http://groovy-lang.org  最新バージョン:2.4.1 ◦ GVMでインストールするのが楽  大きな動き ◦ Pivotalのスポンサードは2015/3末で終了 ◦ Codehaus(ML,JIRA等ホスト)も2015/5には終了 ◦ →Apache Software Foundation(ASF)へ移行の方針  Apache IncubatorにProposal提出 2015-3-13 4
  5. 5.  バージョン1.8からサポート ◦ groovy.json.JsonBuilder  JSON作成用Builder ◦ groovy.json.StreamingJsonBuilder  Writerに書きこむJsonBuilder:1.8.1から ◦ groovy.json.JsonOutput  JSONとしてオブジェクトを文字列に出力 ◦ groovy.json.JsonSlurper  JSON文字列・ファイルの読み込み  後述 2015-3-13 5
  6. 6.  JsonBuilder:JSON文字列をDSLで構築 ◦ Writerに直接書き込む:StreamingJsonBuilder  例: def json = new groovy.json.JsonBuilder() json { person { firstName 'Yasuharu' lastName 'Hayami' } age 42 } println json.toString() 2015-3-13 6
  7. 7.  JsonOutput:オブジェクトを文字列に出力 ◦ prettyPrint(String)で文字列を整形  例: def obj = [person: [firstName: 'Yasuharu', lastName: 'Hayami'], age: 42] File file = new File('output.json') use(groovy.json.JsonOutput) { file.text = obj.toJson().prettyPrint() } 2015-3-13 7
  8. 8.  JsonSlurper:JSON文字列を読み込む ◦ 結果はJavaのListやMapに  例: def slurper = new groovy.json.JsonSlurper() def data = slurper.parseText '''{ "person": { "firstName": "Yasuharu", "lastName": "Hayami" }, "age": 42 }''' println "${groovy.json.JsonOutput.toJson data}" 2015-3-13 8
  9. 9.  JsonBuilderのリストでClosure指定が可能に 例:リスト内Songの値はtitleだけ出力したい class Song { String title … } def mySongs = [new Song (title: "Title 1", …), new Song (title: "Title 2", …), …] JsonBuilder json = new JsonBuilder() def map = json { //今まで songs mySongs.collect { Song s -> json { title s.title } } } 2015-3-13 9
  10. 10.  JsonBuilderのリストでClosure指定が可能に 例:リスト内Songの値はtitleだけ出力したい class Song { String title … } def mySongs = [new Song (title: "Title 1", …), new Song (title: "Title 2", …), …] JsonBuilder json = new JsonBuilder() def map = json { //2.3から songs mySongs, { Song s -> title s.title } } 2015-3-13 10
  11. 11.  JsonSlurper/JsonOutputのパフォーマンス改善 ◦ BoonのJSON実装を基に書き換え  http://richardhightower.github.io/site/Boon/ ◦ JsonSlurperは以前より最大21倍高速(リリースノート)  他のライブラリと比較して大雑把に2~4倍高速  今までの実装はJsonSlurperClassicに変更 ◦ JsonOutputは以前より最大17倍高速(リリースノート)  他のライブラリと同程度の速度に 2015-3-13 11
  12. 12.  JsonBuilder/StreamingJsonBuilderの再実装 ◦ Javaで書き換え→JSON実装はすべてJavaに 2015-3-13 12
  13. 13.  解析の種類を選択:値はJsonParserType ◦ CHARACTER_SOURCE:Readerで読みながら  大きいファイル(2MB以上)で使用 ◦ CHAR_BUFFER:一旦文字列バッファ(char配列)に読み込む  デフォルト、数字・日付を「きちんと」解析したい場合に使用 ◦ LAX:値を文字列バッファへのポインタで持つ  コメントを含む場合に使用  長期的に値を持つ場合'Chop'か'Lazy Chop'を指定しておく ◦ INDEX_OVERLAY:値を文字列バッファへのポインタで持つ  最速、2MB以下での使用がおすすめ  長期的に値を持つ場合'Chop'か'Lazy Chop'を指定しておく 2015-3-13 13
  14. 14.  Readerで固定char配列に読みながら解析  groovy.json.internal.JsonParserUsingCharacterSource ◦ 値は各クラス ◦ 配列はArrayList ◦ オブジェクトはgroovy.json.internal.LazyMap  Serializableでは無い! 2015-3-13 14
  15. 15.  一旦文字列バッファ(char配列)に読み込んで解析  groovy.json.internal.JsonParserCharArray ◦ 値は各クラス ◦ 配列はArrayList ◦ オブジェクトはgroovy.json.internal.LazyMap  Serializableでは無い! 2015-3-13 15
  16. 16.  一旦文字列バッファ(char配列)に読み込んで解析  LAX:groovy.json.internal.JsonParserLax  INDEX_OVERLAY:groovy.json.internal.JsonFastParser ◦ 値はValueインターフェースの実装  char配列,開始位置,終了位置を持つ  数値:groovy.json.internal.NumberValue  文字列:groovy.json.internal.CharSequenceValue  その他:groovy.json.internal.ValueContainer  toValue()で格納した値を返す(true/false/nullは直接返す)  配列はgroovy.json.internal.ValueListで格納  オブジェクトはgroovy.json.internal.LazyValueMapで格納  Key-Valueは一旦groovy.json.internal.MapItemValueで保管  最初のget()でMapに変換  Serializableでは無い! 2015-3-13 16
  17. 17.  Chopについて ◦ 文字列バッファから対象の部分をコピー  開始位置は0  終了位置はchar配列の長さ ◦ JsonSlurper#setChop()で指定  Lazy Chopについて ◦ 配列・オブジェクトから値を取得する際にChop ◦ JsonSlurper#setLazyChop()で指定  日付文字列の判定について ◦ Value#toValue()で日付文字列の場合Date型で返す ◦ JsonSlurper#setCheckDates()で指定 2015-3-13 17

×