Golang Json

5360 ワード

Json文法
JSON文法規則
JSON文法はJavaScriptオブジェクトが文法を表すサブセットです.
  • データはキーパッドペア
  • にあります.
  • データはカンマ区切り
  • です.
  • かっこ保存オブジェクト
  • 四角括弧保存配列
  • JSON名称/値ペア
    JSONデータの書き方は、名称/値のペアです.名前/値ペアの組み合わせの名前は前に書いてください.値ペアは後ろに書いてください.中間はコロンで区切られます.
    "firstName":"John"
    
    これは分かりやすいです.このJavaScript文と同じです.
    firstName="John"
    
    JSON値
    JSON値は、-数字(整数または浮動小数点)-文字列(二重引用符)-論理値(trueまたはfalse)-配列(四角い括弧内)-オブジェクト(かっこ内)-nullとすることができます.
    基礎構造
    JSON構造には2つの構造があります.即ち、オブジェクトと配列の2つの構造であり、この2つの構造によって様々な複雑な構造を表すことができます.
    オブジェクト
    対象はjsで「{}」と表示されている内容で、データ構造は{key:value,key:value,...}のキー値ペアの構造であり、対象に向けた言語ではkeyが対象の属性であり、valueが対応する属性値であるため、受け取り方が対象となります.keyは属性値を取ります.この属性値のタイプは数字、文字列、配列、配列、となります.オブジェクトはいくつかあります
    行列
    配列はjsの中で括弧「[]」で囲まれた内容で、データ構造は「java」、「javascript」、「vb」、…」であり、値の取り方はすべての言語と同じで、索引を用いて取得します.フィールド値の種類は数字、文字列、配列、オブジェクトの何種類かであることができます.
    オブジェクト、配列の2つの構造を経て複雑なデータ構造に組み合わせることができます.
    基本例
    名前/値ペア
    一番簡単な形式で、以下のようなJSONで「名称/値ペア」を表してもいいです.
    {"firstName":"Brett"}
    
    この例は非常に基本的で、実際には等価な純粋なテキストの名前/値ペアよりも多くの空間を占有しています.
    firstName=Brett
    
    しかし、複数の「名前/値ペア」を連結すると、JSONはその価値を表します.まず、複数の「名前/値ペア」を含むレコードを作成できます.
    {"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"}
    
    文法的には、「名前/値ペア」に比べて大きな利点はないが、この場合はJSONの方が使いやすく、読み取り可能性も高い.例えば、上記の3つの値は同じ記録の一部であることを明確に示す.括弧を使って、これらの値に何らかの関係があるようにします.
    は、行列を表します
    一組の値を表す必要がある場合、JSONは読み取り可能性を高めるだけでなく、複雑さを低減することができる.例えば、人名リストを表示することを望むとします.XMLには多くの開始マークと終了マークが必要です.典型的な名前/値ペアを使用する場合は、独自のデータフォーマットを確立するか、またはキー名をperson 1-first Nameのような形に変更する必要があります.JSONを使用する場合は、複数のかっこの記録をグループ化するだけでよい.
    {
    "people":[
        {"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"},
        {"firstName":"Jason","lastName":"Hunter","email":"bbbb"},
        {"firstName":"Elliotte","lastName":"Harold","email":"cccc"}
    ]
    
    この例では、名前と姓と電子メールアドレスが含まれている、peopleという変数だけがあります.上記の例では、かっこでレコードを一つの値に組み合わせる方法を示します.もちろん、同じ構文を使用して複数の値(各値は複数のレコードを含む)を表すことができる.
    {
    "programmers": [{
        "firstName": "Brett",
        "lastName": "McLaughlin",
        "email": "aaaa"
    }, {
        "firstName": "Jason",
        "lastName": "Hunter",
        "email": "bbbb"
    }, {
        "firstName": "Elliotte",
        "lastName": "Harold",
        "email": "cccc"
    }],
    "authors": [{
        "firstName": "Isaac",
        "lastName": "Asimov",
        "genre": "sciencefiction"
    }, {
        "firstName": "Tad",
        "lastName": "Williams",
        "genre": "fantasy"
    }, {
        "firstName": "Frank",
        "lastName": "Peretti",
        "genre": "christianfiction"
    }],
    "musicians": [{
        "firstName": "Eric",
        "lastName": "Clapton",
        "instrument": "guitar"
    }, {
        "firstName": "Sergei",
        "lastName": "Rachmaninoff",
        "instrument": "piano"
    }]
    }
    
    ここで最も注目すべきことは、複数の値を表すことができ、各値はさらに複数の値を含むことである.しかし、異なる主要項目の間では、実際の名前/値ペアが異なることもあることに留意すべきである.JSONは完全に動的であり、JSON構造の中間でデータを表す方式を変更することができる.JSON形式のデータを扱う際には、守るべき規定の制約がありません.したがって、同じデータ構造では、データを表す方式を変えることができ、同じものを異なる形で表すこともできる.
    golang Json
    Go言語のJSONライブラリ
    Go言語のJSON変換庫はencoding/jsonです.
    1.対象をJSONに変換する方法(関数)はJson.Masharl()で、その関数の原型は以下の通りです.
    func Masharl(v interface{}([]byte、error)
    つまり、この関数は任意のタイプのデータvを受信し、バイトの配列タイプに変換し、戻り値は私たちが欲しいJSONデータとエラーコードです.変換に成功した時、このエラーコードはnilです.
    オブジェクトをJSONに変換する過程では、以下のいくつかのルールに従います.
    •ブール型はJSONに変換した後もブール型で、例えばtrue->true
    •浮動小数点型と整数型の変換後はJSONの中の通常の数字で、1.23->1.23のようです.
    •文字列はUTF-8符号化でUnicode文字セットの文字列に出力されます.特殊文字は例えば
    •配列とスライスはJSON内の配列に変換され、[]byte類はbase 64符号化後の文字列に変換され、sliceのゼロ値はnullに変換されます.
    •構造的な理解はJSONオブジェクトに変換され、構造体の中で大文字で始まる導き出すことができるフィールドだけが出力に変換されます.これらの導き出すことができるフィールドはJSONオブジェクトの文字列索引となります.
    •mapタイプのデータ構造を変換する場合、このデータのタイプは必ずmap[string]T(Tはencoding/jsonパッケージでサポートされる任意のデータタイプであっても良いです.)
    2.JSONを対象に戻す方法(関数)はJson.Unimashel()で、その関数の原型は以下の通りです.
    func Unimasharl(data[]byte,v interface{}error
    この関数は入ってきたdataをJSONとして解析し、解析したデータをパラメータvに格納します.このパラメータvも任意のタイプのパラメータである(ただし、一定の種類の指針である).その理由は、この関数でJSON解析を行う場合、この関数はこの着信パラメータの特定のタイプを知らないので、すべてのタイプを受信する必要があるからである.
    解析を行う際には、JSONとオブジェクトの構造が違っていれば何が発生しますか?これは、解析関数Json.Unimasharl()が以下の規則に従う必要があります.
    •Json.Unimasharl()関数は、所定の順序でターゲット構造のフィールドを検索します.もし一つが見つかったらマッチします.何が見つかりましたか?「見つけました」については、JSONオブジェクトに「Foo」というインデックスがあると仮定して、「Foo」に対応する値をターゲット構造体のターゲットフィールドに塗り込めます.Json.Unimashel()は以下の順序で検索します.
    §Fooタグを含むフィールド
    §Fooというフィールド
    §FooまたはFooという名前で、または頭文字以外の文字は大文字と小文字を区別しないで書くFooというフィールドです.これらのフィールドは、タイプ宣言ではすべて大文字で始まる必要があります.エクスポート可能なフィールドです.
    JSONのフィールドがGoターゲットタイプに存在しない場合、Json.Unimasharl()関数は復号中にこのフィールドを破棄します.
    •JSONの構造が未知の場合は、以下の規則に従います.
    §JSONのブール値はGoのブールタイプに変換されます.
    §値はGoのfloat 64タイプに変換されます.
    §文字列変換後もstringタイプ
    §JSON配列は[]interface{}タイプに変換されます.
    §JSONオブジェクトは、map[string]interface{}タイプに変換されます.
    §null値はnilに変換されます.