はじめに

ここではCouchDBにあるデータをJSON形式で取得し,Excelにてそのファイルを読み込み,さらにはデータの整理をしたうえで再びJSON形式で出力するまでの手順について説明しています.加えて,生成されたJSON形式のファイルをJavaで読み書きする方法についても述べます.

環境

手順

JSON形式のファイルを出力

まずはCouchDBから必要なデータの取り出しです.データの取り出すためにCouchDBにViewを追加します.下の図のようにallDataというViewを追加しました.01

 

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として保存します.

02

ExcelでJSONファイルを読み込み

次にExcelでJSONファイルを読み込みます.まず,データタブにあるデータの取得を選択し,ファイルからの中にあるJSONからを選択します.

03

 

次にrowの右側にあるListを選択します.

04

 

リストにはたくさんのRecordがあります.そこで,テーブルへの返還を押します.

05

 

特に何も選択せずにOKを押します.

06

 

Column1の右側にあるアイコンを押すと,展開する属性を選べます.ここでは,id属性が不要ですのでチェックを外し,KeyとValueにチェックがついていることを確認し,OKを押します.

07

 

さらに,valueに入っているtemperatureなどの属性を選択するため,下図のようにします.

08

 

最後に,閉じて読み込むを押します.

09

 

これでJSON形式のファイルをExcelファイルとして読み込めます.今回,Keyに入っている数字は日時を表しており14桁もあるため,指数表示となってしまいます.14桁すべてを表示できるようにするため,下の図のようにColumn1.keyを右クリックし,セルの書式を設定します.

10

 

下の図のように数値としてセルを設定します.これで14桁すべてが表示されるようになるはずです.

11

 

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