JSONの不定データの解析方法

Goのjson.RawMessage型を使用して、未知のJSONデータを一時的に格納します。まず、JSONデータのモデルを表す構造体を定義し、未知のフィールドにはjson.RawMessage型を使用します。次に、json.Unmarshal関数を使用してJSONデータを定義済みの構造体にパースし、必要に応じて未知のフィールドをさらに処理します。

サンプルコードを次に示します。

package main

import (
	"encoding/json"
	"fmt"
)

type UnknownData struct {
	Name       string          `json:"name"`
	Age        int             `json:"age"`
	ExtraField json.RawMessage `json:"extra"`
}

type ExtraData struct {
	Field1 string `json:"field1"`
	Field2 int    `json:"field2"`
}

func main() {
	jsonData := `{
		"name": "John Doe",
		"age": 30,
		"extra": {
			"field1": "value1",
			"field2": 42
		}
	}`

	var data UnknownData
	err := json.Unmarshal([]byte(jsonData), &data)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}

	fmt.Println("Name:", data.Name)
	fmt.Println("Age:", data.Age)

	// 处理未知字段
	var extra ExtraData
	err = json.Unmarshal(data.ExtraField, &extra)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}

	fmt.Println("Extra Field 1:", extra.Field1)
	fmt.Println("Extra Field 2:", extra.Field2)
}

UnknownData構造体のextraフィールドは、json.RawMessage型で、未知のJSONデータを保持することができます。main関数では、JSONデータをUnknownData構造体にパースした後に、必要に応じてjson.Unmarshalでextraフィールドのデータを再度パースできます。

結果は出ます。

Name: John Doe
Age: 30
Extra Field 1: value1
Extra Field 2: 42

こうすれば、不確定な JSON データを解析して、その中の未知のフィールドを処理できます。

bannerAds