2017-10-13 26 views
0

"carrier.json"ファイルのデータを取得し、情報を使用してGoを使用してCSVファイルを作成しようとしています。しかし、私は、フォローエラー/通知を受けていますGolangを使用してjsonファイルをcsvファイルに変換する場合

./carrier_json.go:53:48: obj.APIVersion undefined (type Json has no field or method APIVersion) 
./carrier_json.go:53:69: obj.CarrierSid undefined (type Json has no field or method CarrierSid) 
./carrier_json.go:53:85: obj.AccountSid undefined (type Json has no field or method AccountSid) 
./carrierlookup.go:12:6: main redeclared in this block 
    previous declaration at ./carrier_json.go:31:6 

私は数時間オンラインで検索し、何か助けが大いに評価されるでしょう。注:私はあまり技術的ではありません。

「carrier.json」は、以下を持っている、

{ 
    "Message360": { 
     "ResponseStatus": 1, 
     "Carrier": { 
      "ApiVersion": "3", 
      "CarrierSid": "c7e57a2a-92d7-0430", 
      "AccountSid": "2f4ce81a-f08d-04e1", 
      "PhoneNumber": "+19499999999", 
      "Network": "Cellco Partnership dba Verizon Wireless - CA", 
      "Wireless": "true", 
      "ZipCode": "92604", 
      "City": "Irvine", 
      "Price": "0.0003", 
      "Status": "success", 
      "DateCreated": "2017-10-13 18:44:32" 
     } 
    } 
} 

私は、以下の情報を持っているcarrier_json.goと呼ばれる、外出先ファイルを持っています。

package main 

import (
    "encoding/csv" 
    "encoding/json" 
    "fmt" 
    "io/ioutil" 
    "os" 
    "strconv" 
) 

type Json struct { 
    Message360 struct { 
     ResponseStatus int `json:"ResponseStatus"` 
     Carrier  struct { 
      APIVersion string `json:"ApiVersion"` 
      CarrierSid string `json:"CarrierSid"` 
      AccountSid string `json:"AccountSid"` 
      PhoneNumber string `json:"PhoneNumber"` 
      Network  string `json:"Network"` 
      Wireless string `json:"Wireless"` 
      ZipCode  string `json:"ZipCode"` 
      City  string `json:"City"` 
      Price  string `json:"Price"` 
      Status  string `json:"Status"` 
      DateCreated string `json:"DateCreated"` 
     } `json:"Carrier"` 
    } `json:"Message360"` 
} 

func main() { 
    // reading data from JSON File 
    data, err := ioutil.ReadFile("carrier.json") 
    if err != nil { 
     fmt.Println(err) 
    } 
    // Unmarshal JSON data 
    var d []Json 
    err = json.Unmarshal([]byte(data), &d) 
    if err != nil { 
     fmt.Println(err) 
    } 
    // Create a csv file 
    f, err := os.Create("./carrier.csv") 
    if err != nil { 
     fmt.Println(err) 
    } 
    defer f.Close() 
    // Write Unmarshaled json data to CSV file 
    w := csv.NewWriter(f) 
    for _, obj := range d { 
     var record []string 
     record = append(record, strconv.FormatInt(obj.APIVersion, 10), obj.CarrierSid, obj.AccountSid) 
     w.Write(record) 
     record = nil 
    } 
    w.Flush() 
} 
+4

エラーメッセージは非常に明確です。 'Json'型は' Message360'という名前のフィールドしか持っていません。例えばアクセスする。 'APIVersion'は' jsonObj.Message360.APIVersio'nにアクセスしなければなりません( 'jsonObj'は' JSON'型です)。 – PieOhPah

答えて

0

いくつか間違いがあります。

  1. carrier.jsonは、オブジェクトの代わりに、配列ですが、あなたは[]Json
  2. にそれをアンマーシャリングしたい機能strconv.FormatIntの第一パラメータは、タイプint64のですが、APIVersionのタイプがあるstring
  3. objが型でありますJsonであり、APIVersionという要素はありません。それはobj.Message360.Carrier.APIVersion
  4. dがJsonのスライスなので、複数のCSVレコードを書きたいと思うと思います。 Writeは1つのCSVレコードのみを書き込むため、Writeの代わりにWriteAllを使用する必要があります。 (改善:csvファイルのヘッドを追加)
+0

ありがとうございました。私は変更を加えましたが、今私は次のエラーに遭遇しています:json:[main.JsoタイプのGo値にオブジェクトを非整列化できません。 –

+0

私はそれを動作させることができました。私はあなたの助けに感謝します。 –

関連する問題