質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Q&A

解決済

1回答

385閲覧

Goでjsonファイルを改行区切りのjson(ndjson,jsonl)に変換

mleo21

総合スコア4

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

0グッド

0クリップ

投稿2023/11/22 07:57

編集2023/11/22 08:33

実現したいこと

jsonファイルを改行区切りのjson(ndjson,jsonl)に変換する。

前提

Go言語でjsonファイルを改行区切り形式のjsonに変換したいです。
Goのバージョンは1.20です。

なかなかうまく変換することができません。。。
よろしくお願いします。

試したソースコード

main.go

1package main 2 3import ( 4 "bufio" 5 "encoding/json" 6 "fmt" 7 "io/ioutil" 8 "os" 9) 10 11func main() { 12 // JSONファイルを開く 13 jsonFile, err := os.Open("test2.json") 14 if err != nil { 15 panic(err) 16 } 17 defer jsonFile.Close() 18 19 jsonBody, err := ioutil.ReadAll(jsonFile) 20 if err != nil { 21 panic(err) 22 } 23 24 // Convert json string to map[string]interface{} 25 var mapData map[string]interface{} 26 if err := json.Unmarshal(jsonBody, &mapData); err != nil { 27 fmt.Println(err) 28 } 29 30 // JSONLファイルを開く 31 jsonlFile, err := os.Create("output.jsonl") 32 if err != nil { 33 panic(err) 34 } 35 defer jsonlFile.Close() 36 37 // JSONデータをエンコードしてJSONLファイルに書き込む 38 writer := bufio.NewWriter(jsonlFile) 39 encoder := json.NewEncoder(writer) 40 for _, datum := range mapData { 41 err = encoder.Encode(datum) 42 if err != nil { 43 panic(err) 44 } 45 } 46 writer.Flush() 47}

変換前のjsonファイル

test2.json

1{ 2 "name": "Morpheus", 3 "job": "Leader", 4 "id": "199", 5 "createdAt": "2020-02-20T11:00:28.107Z" 6}

変換後のjsonファイル

"Leader" "199" "2020-02-20T11:00:28.107Z" "Morpheus"

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2023/11/22 08:28

どう変換したいのでしょうか?
mleo21

2023/11/22 08:32

以下のような形式にしたいです。 また複数データがあれば、そのデータが1行ごとに記述されるようにしたいです。 {"name": "Morpheus","job": "Leader","id": "199", "createdAt": "2020-02-20T11:00:28.107Z"}
ikedas

2023/11/22 08:45

お返事はコメント欄ではなく質問文を編集して書いてください。その際、変換したい形式についても```で前後を囲っておくと、変換前の入力や今の出力結果と比較しやすいです。
hoshi-takanori

2023/11/22 08:49

mapData をそのまま encoder.Encode すれば 1 行で出力されると思いますけど、それじゃ駄目でしょうか?
guest

回答1

0

ベストアンサー

JSON データが配列の場合と単一要素の場合で処理を分けます。

go

1package main 2 3import ( 4 "bufio" 5 "bytes" 6 "encoding/json" 7 "io" 8 "os" 9) 10 11func main() { 12 // JSONファイルを開く 13 jsonFile, err := os.Open("test2.json") 14 if err != nil { 15 panic(err) 16 } 17 defer jsonFile.Close() 18 19 jsonBody, err := io.ReadAll(jsonFile) 20 if err != nil { 21 panic(err) 22 } 23 24 // marshalling 25 type mapDatum map[string]interface{} 26 var mapData []mapDatum 27 if bytes.HasPrefix(bytes.TrimSpace(jsonBody), []byte{'['}) { 28 // array 29 if err := json.Unmarshal(jsonBody, &mapData); err != nil { 30 panic(err) 31 } 32 } else { 33 // single value 34 var data mapDatum 35 if err := json.Unmarshal(jsonBody, &data); err != nil { 36 panic(err) 37 } 38 mapData = []mapDatum{data} 39 } 40 41 // JSONLファイルを開く 42 jsonlFile, err := os.Create("output.jsonl") 43 if err != nil { 44 panic(err) 45 } 46 defer jsonlFile.Close() 47 48 // JSONデータをエンコードしてJSONLファイルに書き込む 49 writer := bufio.NewWriter(jsonlFile) 50 encoder := json.NewEncoder(writer) 51 for _, datum := range mapData { 52 err = encoder.Encode(datum) 53 if err != nil { 54 panic(err) 55 } 56 } 57 writer.Flush() 58}

投稿2023/11/22 10:00

melian

総合スコア21118

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mleo21

2023/11/23 07:37

できました!ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問