golang は json を解析できません

WBOY
リリース: 2023-05-15 11:22:07
オリジナル
2154 人が閲覧しました

Golang は非常に実用的なプログラミング言語であり、その主な設計目標は、プログラムの可読性、保守性、信頼性を向上させることです。 Golang プログラムを作成する場合、多くの場合、データのシリアル化と通信の標準形式として JSON を使用する必要があります。ただし、Golang を使用して JSON を解析すると、JSON を解析できないなどの問題が発生することがあります。この記事では、一般的な JSON 解析エラーをいくつか紹介し、いくつかの解決策を提供します。

  1. 空の JSON オブジェクトを解析できません

Golang では、json.Unmarsha1l 関数を使用して、JSON データを Go 言語の構造体またはスライスに解析できます。ただし、空の JSON オブジェクトを解析しようとすると、Go 言語はエラーを報告します:

json: cannot unmarshal object into Go struct field .Field of type string
ログイン後にコピー
ログイン後にコピー

これは、空の JSON オブジェクトにはキーと値のペアがないため、パーサーはそれを解析できません。 Go 構造。解決策としては、ポインターを使用して構造体フィールドをオプションとしてマークし、空の JSON オブジェクトをサポートできるようにすることができます。例:

type MyStruct struct {
    Field *string
}

data := []byte(`{}`)
var s MyStruct
err := json.Unmarshal(data, &s)
if err != nil {
    log.Fatal(err)
}
fmt.Println(s.Field) // output: <nil>
ログイン後にコピー
  1. JSON の null 値を解析できません

JSON では、null は空の値を表し、Golang の対応する型は nil です。 JSON の null 値を解析しようとすると、Go 言語はエラーを報告します:

json: cannot unmarshal null into Go struct field .Field of type string
ログイン後にコピー

これは、Go 言語では JSON の null 値を非ポインター型に変換できないためです。解決策は、ポインター型を使用して構造体フィールドを宣言することです。

type MyStruct struct {
    Field *string
}

data := []byte(`{"Field": null}`)
var s MyStruct
err := json.Unmarshal(data, &s)
if err != nil {
    log.Fatal(err)
}
fmt.Println(s.Field) // output: <nil>
ログイン後にコピー
  1. JSON で空の配列を解析できません

JSON では、空の配列は要素のない配列を表します。 、Golang での対応する型は [] です。 JSON で空の配列を解析しようとすると、Go 言語は次のエラーを報告します:

json: cannot unmarshal array into Go struct field .Field of type []string
ログイン後にコピー

これは、空の配列を非ポインター型のスライスに変換できないためです。解決策は、ポインター型を使用してスライスを宣言することです。

type MyStruct struct {
    Field *[]string
}

data := []byte(`{"Field": []}`)
var s MyStruct
err := json.Unmarshal(data, &s)
if err != nil {
    log.Fatal(err)
}
fmt.Println(s.Field) // output: &[]
ログイン後にコピー
  1. JSON でネストされたオブジェクトを解析できません

JSON では、複数のオブジェクトをネストできます。ただし、ネストされたオブジェクトを解析するときに、Golang はエラーを報告します:

json: cannot unmarshal object into Go struct field .Field of type string
ログイン後にコピー
ログイン後にコピー

これは、Golang がネストされたオブジェクトを非構造型フィールドに変換できないためです。解決策は、構造タイプを使用してネストされたオブジェクトを解析することです。

type Field struct {
    Name string
}
type MyStruct struct {
    Field Field
}

data := []byte(`{"Field": {"Name": "value"}}`)
var s MyStruct
err := json.Unmarshal(data, &s)
if err != nil {
    log.Fatal(err)
}
fmt.Println(s.Field.Name) // output: "value"
ログイン後にコピー
  1. JSON では非 ASCII 文字を解析できません

JSON では、UTF-8 文字を使用できます。 ASCII 文字と非 ASCII 文字を含む任意の文字をエンコードするように設定します。ただし、JSON 内の非 ASCII 文字を解析すると、Golang はエラーを報告します:

json: invalid character 'ò' looking for beginning of value
ログイン後にコピー

これは、Go 言語がデフォルトで UTF-8 エンコーディングを使用しており、JSON データ内の文字が UTF-8 ではない可能性があるためです。 8 がエンコードされました。解決策は、JSON の元のバイナリ エンコーディングなど、他のエンコーディング形式を解析に使用することです。

data := []byte{0x22, 0xC3, 0xB2, 0x22}
var s string
err := json.Unmarshal(data, &s)
if err != nil {
    log.Fatal(err)
}
fmt.Println(s) // output: "ò"
ログイン後にコピー

Golang プログラムを作成する場合、多くの場合、JSON データ形式を使用する必要がありますが、解析時に問題が発生することがあります。 JSON。この記事では、いくつかの一般的な JSON 解析エラーについて説明し、いくつかの回避策を提供します。これらのヒントが、Golang プログラムを作成する際のよくある間違いを避けるのに役立つことを願っています。

以上がgolang は json を解析できませんの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!