はじめに
ここでは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の両ライブラリを使用していますのでそれらをプロジェクトに追加してください.
