2017-10-13 2 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은 하나의 CSV 레코드 만 쓰기 때문에 Write 대신 WriteAll을 사용해야합니다. (향상 : csv 파일의 헤드 추가)
+0

도움 주셔서 감사합니다. 나는 다음과 같은 오류로 실행하고있다. json : 객체를 [[] main.Jso 유형의 Go 값으로 비동기화할 수 없다. –

+0

나는 그것을 작동시킬 수 있었다. 도와 주셔서 감사합니다. –

관련 문제