2016-07-26 20 views
0

私はgolangに新しく、次のjson文字列からデータを取得する必要があります。今、私は同様のgolang配列リストを持つjsonをglolangの構造体に変換する

type IntervalData struct { 
    Data json.RawMessage `json:"data"` 
    Did string `json:"did"` 
    Sid string `json:"sid"` 
} 

type IntervalDataList []string 

r := IntervalData{} 
    json.Unmarshal([]byte(json), &r) 
    log.Printf("Raw Body: %s", r) 

    log.Printf("Raw Date Json: %s", r.Data) 

    blist := IntervalDataList{} 
    json.Unmarshal([]byte(r.Data), &blist) 
    log.Printf("Date List : %s", blist) 

のようなJSONアンマーシャリングコードでSIDを取得することができるだけこのコードを構造体をしようとしたJSON文字列から示されていないデータをしたために

{"data" : ["2016-06-21","2016-06-22","2016-06-25"], "sid" : "ab", "did" : "123"} 

空の地図として。
上記のjsonからデータを取得する方法は何でしょうか。

UPDATE:問題が解決しました。私の入力jsonは{"data":"[\"dsadsdsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n\"sdsdadsddad\"]","did":"654646456","sid":"88683627434"}という形式で提供されていますが、これは必須ではありません。次に、クライアントのスクリプトをチェックし、オンラインソースに基づいて変更を加えました。 How to JSONize a uint8 slice in Go?

type RequestData struct { 
    Data JSONableSlice `json:"data"` 
    Did string `json:"did"` 
    Sid string `json:"sid"` 
} 
type JSONableSlice []uint8 

func (u JSONableSlice) MarshalJSON() ([]byte, error) { 
    var result string 
    if u == nil { 
     result = "null" 
    } else { 
     result = strings.Join(strings.Fields(fmt.Sprintf("%d", u)), ",") 
    } 
    return []byte(result), nil 
} 

func ApiRequest(w http.ResponseWriter, r *http.Request) { 
    sid := r.Header.Get("sid") 
    deviceID := r.Header.Get("deviceId") 

    body, err := ioutil.ReadAll(r.Body) 
    failOnError(err, "Issue faced during reading post contents") 
    data := RequestData{ 
     Data: body, 
     Sid: sid, 
     Did: dID, 
    } 

    bdata, err := json.Marshal(data) 

    // Some Rabbit MQ Connection code 

    // Rabbit MQ publish code 
    err = ch.Publish(
     "",  // exchange 
     q.Name, // routing key 
     false, // mandatory 
     false, // immediate 
     amqp.Publishing{ 
      DeliveryMode: amqp.Persistent, 
      ContentType: "text/plain", 
      Body:   bdata, 
    }) 
} 

あまり変更はアンエクスポートフィールドであるr.dataを参照しているあなたのコード例では、今、消費者のコードで

type IntervalData struct { 
     //Data json.RawMessage `json:"data"` 
     Data []byte `json:"data"` 
     Did string `json:"did"` 
     Sid string `json:"sid"` 
    } 
    r := IntervalData{} 
    json.Unmarshal([]byte(json), &r) 
    log.Printf("Raw Body: %s", r) 

    log.Printf("Raw Date Json: %s", r.Data) 

    blist := IntervalDataList{} 
    json.Unmarshal(r.Data, &blist) 
    log.Printf("Date List : %s", blist) 
+0

https://github.com/antonholmquist/jason – pregmatch

+0

は、たぶん私はポイントを逃したが、何が '[] STRING'として' IntervalData.Data'宣言した反対を話しますか? https://play.golang.org/p/ken-wOlYBf – Havelock

答えて

1

を必要!しかし、タイプIntervalDataにはがあります。IntervalData.Dataフィールド!これは矛盾しています。

だから、ほとんどの場合、あなたのIntervalDatajsonパッケージは無視アンエクスポートdataフィールドが、含まれている、唯一のエクスポートされたフィールドは、/アンマーシャルマーシャリングされています。

エクスポートするIntervalData.dataフィールドを変更するだけです:IntervalData.Data

j := `{"data" : ["2016-06-21","2016-06-22","2016-06-25"], "sid" : "ab", "did" : "123"}` 
r := IntervalData{} 
json.Unmarshal([]byte(j), &r) 
log.Printf("Raw Body: %s", r) 

log.Printf("Raw Data Json: %s", r.Data) 

blist := IntervalDataList{} 
json.Unmarshal([]byte(r.Data), &blist) 
log.Printf("Data List : %s", blist) 

出力(Go Playground上でそれを試してみてください):

2009/11/10 23:00:00 Raw Body: {["2016-06-21","2016-06-22","2016-06-25"] 123 ab} 
2009/11/10 23:00:00 Raw Data Json: ["2016-06-21","2016-06-22","2016-06-25"] 
2009/11/10 23:00:00 Data List : [2016-06-21 2016-06-22 2016-06-25] 

またjson.RawMessageフィールドと第2マーシャリング解除が不要であることに注意してください、あなたが定義することができ

は、この実施例を参照してください。 DataはタイプIntervalDataListであり、単一の非マーシャルで動作します。

Data IntervalDataList `json:"data"` 

とマーシャリング解除:

j := `{"data" : ["2016-06-21","2016-06-22","2016-06-25"], "sid" : "ab", "did" : "123"}` 
r := IntervalData{} 
json.Unmarshal([]byte(j), &r) 
log.Printf("Raw Data Json: %s", r.Data) 

出力(Go Playgroundでこれを試してください):

2009/11/10 23:00:00 Raw Data Json: [2016-06-21 2016-06-22 2016-06-25] 
+0

ああ、間違いを入力しています、私のコードはデータ変数ではありませんが、興味深いことにあなたが与えたリンクで作業しています。さらにチェックした後、私はjson変数が文字列型ではなく、[] uint8型(メッセージコンシューマーの応答から来る)であることがわかりました。 –

+1

@ kuldeep.kamboj '[] uint8'は' [] byte'と同じです。これは 'json.RawMessage'がどのように定義されているかです:' type RawMessage [] byte' – icza

0

以下のコード(またはhttps://play.golang.org/p/kQRE7xYjrz中)JSON文字列を抽出/プリント解析し、データフィールド:

package main 

import (
    "encoding/json" 
    "fmt" 
) 

var data = []byte(`{"data" : ["2016-06-21","2016-06-22","2016-06-25"], "sid" : "ab", "did" : "123"}`) 

type IntervalDataList []string 

type IntervalData struct { 
    Data IntervalDataList `json:"data"` 
    Did string   `json:"did"` 
    Sid string   `json:"sid"` 
} 

func main() { 
    r := &IntervalData{} 
    err := json.Unmarshal(data, r) 
    if err != nil { 
     panic(err) 
    } 
    fmt.Printf("Data: %#v\n", r.Data) 
} 

出力:

Data: main.IntervalDataList{"2016-06-21", "2016-06-22", "2016-06-25"} 
+0

iczaポイントとして初期コードも動作しますが、主な問題は、実際のjsonは期待されるjsonとは異なります。これは、データ値の前後に二重引用符を追加します(また、引用符もエスケープします)。 –

関連する問題