はじめに
ここではCouchDBにあるデータをJSON形式で取得し,Excelにてそのファイルを読み込み,さらにはデータの整理をしたうえで再びJSON形式で出力するまでの手順について説明しています.加えて,生成されたJSON形式のファイルをJavaで読み書きする方法についても述べます.
環境
- CouchDB: v3.1.1
- jsonschema2pojo: v1.1.1
- Excel: 2019
手順
JSON形式のファイルを出力
まずはCouchDBから必要なデータの取り出しです.データの取り出すためにCouchDBにViewを追加します.下の図のようにallDataというViewを追加しました.
fanctionは下のようになります.temperature, luminance, distanceのいずれも含まれているデータのみ取り出しました.これにより,Keyは日時を表す14桁の数字,Valueはtemperature, luminance, distanceを要素を持ちます.
function (doc) { if('temperature' in doc && 'luminance' in doc && 'distance' in doc) { emit(doc.year*10000000000+doc.month*100000000+doc.day*1000000+doc.hour*10000+doc.minute*100+doc.second, {"temperature": doc.temperature, "luminance": doc.luminance, "disntance": doc.distance}); } }
このViewを使ってデータを取り出します.それには下図のようにブラウザを用います.URLとしては,IPアドレス/データベース名/_design/デザインドキュメント名(ここではallData)/_view/Viewの名前(ここではallData)を指定します.あとはブラウザに表示されたJSON形式の文字列をコピーし,適当なファイルへ保存します.ここではdata.jsonとして保存します.
ExcelでJSONファイルを読み込み
次にExcelでJSONファイルを読み込みます.まず,データタブにあるデータの取得を選択し,ファイルからの中にあるJSONからを選択します.
次にrowの右側にあるListを選択します.
リストにはたくさんのRecordがあります.そこで,テーブルへの返還を押します.
特に何も選択せずにOKを押します.
Column1の右側にあるアイコンを押すと,展開する属性を選べます.ここでは,id属性が不要ですのでチェックを外し,KeyとValueにチェックがついていることを確認し,OKを押します.
さらに,valueに入っているtemperatureなどの属性を選択するため,下図のようにします.
最後に,閉じて読み込むを押します.
これでJSON形式のファイルをExcelファイルとして読み込めます.今回,Keyに入っている数字は日時を表しており14桁もあるため,指数表示となってしまいます.14桁すべてを表示できるようにするため,下の図のようにColumn1.keyを右クリックし,セルの書式を設定します.
下の図のように数値としてセルを設定します.これで14桁すべてが表示されるようになるはずです.
ExcelからJSONファイルの出力
こちらにあるサイトに基づき,ExcelからJSONファイルを出力しました.下に示すプログラムでJSONファイルを出力します.参照元サイトにあるプログラムでは,すべての要素を無名の配列として出力されますが,今回は「datum」というキー,各要素の配列をバリューとするような形式に出力するよう,プログラムを少し改変してあります.このように修正したのは,後述のjsonschema2pojoにてJSONファイルの読み書きプログラムを生成する際,そのままではJavaプログラムを生成できなかったためです.
下に示すVBAを実行すると,タブ名と同じJSON形式のファイルがExcelファイルと同じフォルダに作成されます.生成されたJSONファイルをobservationData.jsonとリネームし,以下の処理を行います.
Sub make_json() ThisWorkbook.Activate '変数定義 Const adTypeBinary = 1 Const adTypeText = 2 Const adSaveCreateOverWrite = 2 Dim fileName, fileFolder, fileFile As String Dim isFirstRow As Boolean Dim i, u As Long '最終行取得 Dim maxRow, maxCol As Long If Len(ActiveSheet.Range("A2").Value) = 0 Then maxRow = 0 ElseIf Len(ActiveSheet.Range("A3").Value) = 0 Then maxRow = 1 Else maxRow = ActiveSheet.Range("A1").End(xlDown).Row End If '最終列取得 maxCol = Range("A1").End(xlToRight).Column 'JSONファイル定義 fileName = ActiveSheet.Name 'JSONファイル名を指定 fileFolder = ThisWorkbook.Path '新しいファイルの保存先フォルダ名 fileFile = fileFolder & "\" & fileName '新しいファイルをフルパスで定義 '同名のJSONファイルが既にある場合は削除する If Dir(fileFile) <> "" Then Kill fileFile End If 'JSON作成 'オブジェクトを用意する Dim txt As Object Set txt = CreateObject("ADODB.Stream") txt.Charset = "UTF-8" txt.Open 'JSON開始タグ isFirstRow = True txt.Writetext "{" & vbCrLf & vbTab & """datum"":" & vbCrLf & vbTab & "[" & vbCrLf, adWriteLine 'リストをオブジェクトに書き込む For i = 2 To maxRow '1行目か確認して2行目以降の場合は行頭に","を挿入 If isFirstRow = True Then isFirstRow = False Else txt.Writetext "," & vbCrLf, adWriteLine End If '行の開始タグを挿入 txt.Writetext vbTab & vbTab & "{" & vbCrLf, adWriteLine For u = 1 To maxCol '最終列でない場合は","を挿入 If u = maxCol Then txt.Writetext vbTab & vbTab & vbTab & """" & Cells(1, u).Value & """" & ":" & """" & Cells(i, u).Value & """" & vbCrLf, adWriteLine Else txt.Writetext vbTab & vbTab & vbTab & """" & Cells(1, u).Value & """" & ":" & """" & Cells(i, u).Value & """" & "," & vbCrLf, adWriteLine End If Next u '行の閉じタグを挿入 txt.Writetext vbTab & vbTab & "}", adWriteLine Next 'JSON終了タグ txt.Writetext vbCrLf, adWriteLine txt.Writetext vbTab & "]" & vbCrLf & "}" & vbCrLf, adWriteLine 'BOMを削除する txt.Position = 0 txt.Type = adTypeBinary txt.Position = 3 Dim tmp() As Byte tmp = txt.Read txt.Close txt.Open txt.Write tmp 'オブジェクトの内容をファイルに保存 txt.SaveToFile fileFile, adSaveCreateOverWrite 'オブジェクトを閉じる txt.Close MsgBox ("ファイルを生成しました。") End Sub
JSONファイルをJavaで取り扱う
jsonschema2pojoを使えば,JSONファイルをJavaで読み書きするためのソースコードを生成してくれます.こちらにあるサイトを使えば,ブラウザ上でJavaソースを得られます.ただし,時々このサイトが落ちてしまうことがあるみたいですので,ここではjsonschema2pojoをダウンロードし,ローカルのパソコンでJavaソースを生成する方法について説明しておきます.
こちらのサイトで最新のjsonschema2pojoをダウンロードしてください.解凍しするとbinフォルダが現れますので,コマンドプロンプトにてそのディレクトリへ移動してください.そして,下に示すように実行します.ここでは,ソースタイプをJSONするとともに,Javaソースのパッケージを指定しています.
jsonschema2pojo --source-type JSON --source "C:\Users\ashida\Desktop\observationData.json" --target java-gen --package jp.ac.nagano_nct.ashida_lab.depth_of_water.json
あとは生成されたソースコードをJavaのプロジェクトへ追加します.なお,今回はjacksonとjavax.annotation-apiの両ライブラリを使用していますのでそれらをプロジェクトに追加してください.