2017-06-28 5 views
0

を文字列に:コンバートJSON単一素子アレイは、私は、このJSONを解析する必要がゴーで

{ 
    "response": [ 
    { 
     "message": [ 
     "hello world" 
     ], 
     "misc": [ 
     { 
      "timestamp": [ 
      "2017-06-28T05:52:39.347Z" 
      ], 
      "server": [ 
      "server-0101" 
      ] 
     } 
     ] 
    } 
    ] 
} 

私は、単一の文字列を含むすべての不要な配列のを含んでいない移動中のオブジェクトを取得したいのですが。ソースjsonは、各配列に複数の文字列を持つことはありません。

だから私は取得したいのですが最終的な結果は、このJSONのようになります。

{ 
    "response": { 
    "message": "hello world", 
    "misc": { 
     "timestamp": "2017-06-28T05:52:39.347Z", 
     "server": "server-0101" 
    } 
    } 
} 

または移動中に同等のオブジェクト。

今私はResponse[0].Misc[0].Timestamp[0]を使用して奇妙なデータにアクセスする必要があります。

答えて

0

私はGoで1つの文字列ですべての不要な配列が含まれていないオブジェクトを取得したいと考えています。

難しい方法:手でJSONを解析する(独自のパーサーを作成する)。

パッケージコード/ jsonをJSONと一致するGoタイプに変換するか、またはinterface{}という一般的なものに非マーシャルし、後でより簡単なGoタイプにコピーします。

0

structのデフォルト動作をjson.Marshal/json.Unmarshalメソッドよりも優先させるには、MarshalJSONまたはUnmarshalJSONを適切に定義します。

ここでは、デコードする必要がある構造体の簡略化されたバージョンのコードの抜粋があります。

hereにアクセスできます。

私はあなたがこの面白いarticle about custom JSON encode/decode with golangを読むことをお勧めします。

0

独自のアンマーシャラーを作成するのがおそらく最適ですが、これは達成したいものを簡単にシミュレートする方法です。私はこの回答については好きではない何

package main 

import (
    "encoding/json" 
    "fmt" 
) 

// JSON ... 
var JSON = `{ 
    "response": [ 
    { 
     "message": [ 
     "hello world" 
     ], 
     "misc": [ 
     { 
      "timestamp": [ 
      "2017-06-28T05:52:39.347Z" 
      ], 
      "server": [ 
      "server-0101" 
      ] 
     } 
     ] 
    } 
    ] 
} 
` 

type rawObject struct { 
    Response []struct { 
     Message []string  `json:"message"` 
     Misc []interface{} `json:"misc"` 
    } `json:"response"` 
} 

type clean struct { 
    Message string     `json:"message"` 
    Misc map[string]interface{} `json:"misc"` 
} 

func main() { 
    var o rawObject 
    var c clean 
    // init map 
    c.Misc = make(map[string]interface{}) 

    // unmarshall the raw data 
    json.Unmarshal([]byte(JSON), &o) 

    for _, res := range o.Response { // I assume there should only be one response, don't know why this is wrapped as an array 
     // assume message is not really an array 
     c.Message = res.Message[0] 
     // convert []interface to map[string]interface 
     for _, m := range res.Misc { 
      for k, v := range m.(map[string]interface{}) { 
       c.Misc[k] = v 
      } 
     } 
    } 
    fmt.Printf("%+v\n", c) 
} 

はそれが非常にreusable..so機能がおそらく行われ、多くのエラーが(カスタムアンマーシャラーを作成する部分)をチェックしなければならないではないということです。これが重いプロダクションで使用された場合、cleanオブジェクトを作成するための生のオブジェクトを作成する必要があるため、メモリの問題が発生する可能性があります。私はそれが冗長であることがわかるので、私のクリーンな構造体はタイプとして応答を追加しません。

関連する問題