헤이 마샬

안녕하세요 여러분,

프로젝트를 만들기 전에 다른 문제에 대해 간단히 이야기합시다. Json, Struct, Marshall 및 UnMarshall이란 무엇입니까? 이 문서에서는 Struct에 Json을 소개하고 이에 적합합니다. 요청 방법 및 변환 방법. 이러한 필수 패키지는 무엇입니까? 구조체는 필드 컬렉션을 나타내는 사용자 정의 유형입니다. C# 코드를 작성하기 전에 기억할 수 있습니다. 그럼 시작하겠습니다. 먼저 간단한 구조체를 정의하는 방법입니다.

type Users struct{}

type Customers struct{}

type Students struct{
    FirstName string
    LastName  string
}


새로운 GoLang 프로젝트를 생성하고 실행해 봅시다.



학생 구조체 만들기




type Student struct{
    FirstName string 
    LastName  string
}

type Company struct{
    Name string `json:"name"`
    Address  string `json:"address"`
}

//initialize
student := Student{FirstName:"Burak", LastName:"Seyhan"}


귀하의 응용 프로그램에는 이미 있습니다. go get -u 명령을 실행하지 않습니다.

육군 원수()



Go 개체를 JSON으로 변환하는 것을 GoLang에서는 Marshal()이라고 합니다. JSON은 언어 독립적인 데이터 형식이기 때문입니다.

package main

import (
    "fmt"
    "encoding/json"
)

type Student struct{
    FirstName string
    LastName  string
}

func main()  {
    fmt.Println("Welcome to Json and Struct Implementation")

    //initialize
    student := Student{FirstName:"Burak", LastName:"Seyhan"}

    data, err := json.Marshal(student)
    if(err != nil){
        fmt.Println(err)
    }

    fmt.Println(data) // data is byteArray
    fmt.Println(string(data)) convert to byteArray to string
}   





언마샬()



Marshal과 정반대인 Unmarshalling.

var unmarshalStudent Student
unmarshal := json.Unmarshal([]byte(data), &unmarshalStudent)

if(unmarshal != nil){
    fmt.Println(unmarshal)
}

fmt.Printf("%v+\n", data)




전체 코드

package main

import (
    "fmt"
    "encoding/json"
)

type Student struct{
    FirstName string `json:"firtname"`
    LastName  string `json:"lastnamename"`
}


func main()  {
    fmt.Println("Welcome to Json and Struct Implementation")


    //initialize
    student := Student{FirstName:"Burak", LastName:"Seyhan"}

    data, err := json.Marshal(student)
    if(err != nil){
        fmt.Println(err)
    }

    fmt.Println(data)
    fmt.Println(string(data))


    var unmarshalStudent Student
    unmarshal := json.Unmarshal([]byte(data), &unmarshalStudent)
    if(unmarshal != nil){
        fmt.Println(unmarshal)
    }
    fmt.Printf("%v+\n", data)

}   


실제 사례



이 예에서는 공용 웹 API를 요청합니다. PublicAPI 이 끝점은 일부 사용자 정보와 관련이 있습니다. 처음에는 Struct를 만들 것입니다.

type Users struct{
    Id int `json:"id"`
    Name  string `json:"name"`
    UserName  string `json:"username"`
    Email  string `json:"email"`
    Address  Address `json:"address"`
    Phone  string `json:"phone"`
    Website  string `json:"website"`
    Company  Company `json:"company"`
}

type Address struct{
    Street  string `json:"street"`
    Suite  string `json:"suite"`
    City  string `json:"city"`
    Zipcode  string `json:"zipcode"`
}

type Company struct{
    Name  string `json:"name"`
    CatchPhrase  string `json:"catchPhrase"`
    Bs  string `json:"bs"`
}



다음 단계는 웹 요청을 만드는 것입니다. About net/http

    //endpoint
    url := "https://jsonplaceholder.typicode.com/users"

    //create a client
    client := http.Client{
        Timeout: time.Second * 2, // Timeout after 2 seconds
    }

    //prepera new request s
    req, err := http.NewRequest(http.MethodGet, url, nil)
    if(err != nil){
        fmt.Println(err)
    }

    result , getErr:= client.Do(req)
    if(getErr != nil){
        fmt.Println(getErr)
    }
    fmt.Println(result)




함수 끝에서 result.Body.Close()를 실행하는 defer 키워드는 응답 본문을 닫는 데 사용됩니다.

if(result.Body != nil){
        defer result.Body.Close()
    }

    body, _ := ioutil.ReadAll(result.Body)

    users := []Users{} // declare array cause Json data is array

    jsonErr := json.Unmarshal(body, &users)

    if(jsonErr != nil){
        fmt.Println(jsonErr)
    }

    for _, data := range users{
        fmt.Println(data)
    }





패키지



이 패키지는 기본적으로 로드되므로 go get 명령이 필요하지 않습니다.
  • "fmt"
  • "net/http"
  • "시간"
  • "io/ioutil"
  • "인코딩/json"

  • 일부 정보를 표시하거나 클라이언트로부터 입력을 받는 데 사용하는 "fmt"패키지이지만 "fmt"코드를 사용하지 않으려면 GoLang이 기본 패키지와 함께 제공되기 때문에 Println("")입니다. "net/http"패키지는 "fmt"패키지와 동일한 웹 요청 패키지입니다. DateTime과 같은 시간 정보와 관련된 "time"패키지. 이 예에서는 그럴 필요가 없습니다. 실제로 시간 초과를 설정할 필요는 없습니다. 관심 있는 응답을 얻으려면 "io/ioutil"패키지를 사용하는 이유인 Body 속성에 액세스해야 합니다. 마샬링 및 언마샬링 함수와 관련된 "encoding/json"패키지.

    다른 사용법




    url := "https://jsonplaceholder.typicode.com/users"
    
    resp, err := http.Get(url)
    if err != nil {
       fmt.Println(err)
    }
    
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println(err)
    }
    
    fmt.Println(string(body))
    


    이제 실행go run main.go 결과 보기:

    [
      {
        "id": 1,
        "name": "Leanne Graham",
        "username": "Bret",
        "email": "[email protected]",
        "address": {
          "street": "Kulas Light",
          "suite": "Apt. 556",
          "city": "Gwenborough",
          "zipcode": "92998-3874",
          "geo": {
            "lat": "-37.3159",
            "lng": "81.1496"
          }
        },
        "phone": "1-770-736-8031 x56442",
        "website": "hildegard.org",
        "company": {
          "name": "Romaguera-Crona",
          "catchPhrase": "Multi-layered client-server neural-net",
          "bs": "harness real-time e-markets"
        }
      },
      {
        "id": 2,
        "name": "Ervin Howell",
        "username": "Antonette",
        "email": "[email protected]",
        "address": {
          "street": "Victor Plains",
          "suite": "Suite 879",
          "city": "Wisokyburgh",
          "zipcode": "90566-7771",
          "geo": {
            "lat": "-43.9509",
            "lng": "-34.4618"
          }
        },
        "phone": "010-692-6593 x09125",
        "website": "anastasia.net",
        "company": {
          "name": "Deckow-Crist",
          "catchPhrase": "Proactive didactic contingency",
          "bs": "synergize scalable supply-chains"
        }
      },
      {
        "id": 3,
        "name": "Clementine Bauch",
        "username": "Samantha",
        "email": "[email protected]",
        "address": {
          "street": "Douglas Extension",
          "suite": "Suite 847",
          "city": "McKenziehaven",
          "zipcode": "59590-4157",
          "geo": {
            "lat": "-68.6102",
            "lng": "-47.0653"
          }
        },
        "phone": "1-463-123-4447",
        "website": "ramiro.info",
        "company": {
          "name": "Romaguera-Jacobson",
          "catchPhrase": "Face to face bifurcated interface",
          "bs": "e-enable strategic applications"
        }
      },
      {
        "id": 4,
        "name": "Patricia Lebsack",
        "username": "Karianne",
        "email": "[email protected]",
        "address": {
          "street": "Hoeger Mall",
          "suite": "Apt. 692",
          "city": "South Elvis",
          "zipcode": "53919-4257",
          "geo": {
            "lat": "29.4572",
            "lng": "-164.2990"
          }
        },
        "phone": "493-170-9623 x156",
        "website": "kale.biz",
        "company": {
          "name": "Robel-Corkery",
          "catchPhrase": "Multi-tiered zero tolerance productivity",
          "bs": "transition cutting-edge web services"
        }
      },
      {
        "id": 5,
        "name": "Chelsey Dietrich",
        "username": "Kamren",
        "email": "[email protected]",
        "address": {
          "street": "Skiles Walks",
          "suite": "Suite 351",
          "city": "Roscoeview",
          "zipcode": "33263",
          "geo": {
            "lat": "-31.8129",
            "lng": "62.5342"
          }
        },
        "phone": "(254)954-1289",
        "website": "demarco.info",
        "company": {
          "name": "Keebler LLC",
          "catchPhrase": "User-centric fault-tolerant solution",
          "bs": "revolutionize end-to-end systems"
        }
      },
      {
        "id": 6,
        "name": "Mrs. Dennis Schulist",
        "username": "Leopoldo_Corkery",
        "email": "[email protected]",
        "address": {
          "street": "Norberto Crossing",
          "suite": "Apt. 950",
          "city": "South Christy",
          "zipcode": "23505-1337",
          "geo": {
            "lat": "-71.4197",
            "lng": "71.7478"
          }
        },
        "phone": "1-477-935-8478 x6430",
        "website": "ola.org",
        "company": {
          "name": "Considine-Lockman",
          "catchPhrase": "Synchronised bottom-line interface",
          "bs": "e-enable innovative applications"
        }
      },
      {
        "id": 7,
        "name": "Kurtis Weissnat",
        "username": "Elwyn.Skiles",
        "email": "[email protected]",
        "address": {
          "street": "Rex Trail",
          "suite": "Suite 280",
          "city": "Howemouth",
          "zipcode": "58804-1099",
          "geo": {
            "lat": "24.8918",
            "lng": "21.8984"
          }
        },
        "phone": "210.067.6132",
        "website": "elvis.io",
        "company": {
          "name": "Johns Group",
          "catchPhrase": "Configurable multimedia task-force",
          "bs": "generate enterprise e-tailers"
        }
      },
      {
        "id": 8,
        "name": "Nicholas Runolfsdottir V",
        "username": "Maxime_Nienow",
        "email": "[email protected]",
        "address": {
          "street": "Ellsworth Summit",
          "suite": "Suite 729",
          "city": "Aliyaview",
          "zipcode": "45169",
          "geo": {
            "lat": "-14.3990",
            "lng": "-120.7677"
          }
        },
        "phone": "586.493.6943 x140",
        "website": "jacynthe.com",
        "company": {
          "name": "Abernathy Group",
          "catchPhrase": "Implemented secondary concept",
          "bs": "e-enable extensible e-tailers"
        }
      },
      {
        "id": 9,
        "name": "Glenna Reichert",
        "username": "Delphine",
        "email": "[email protected]",
        "address": {
          "street": "Dayna Park",
          "suite": "Suite 449",
          "city": "Bartholomebury",
          "zipcode": "76495-3109",
          "geo": {
            "lat": "24.6463",
            "lng": "-168.8889"
          }
        },
        "phone": "(775)976-6794 x41206",
        "website": "conrad.com",
        "company": {
          "name": "Yost and Sons",
          "catchPhrase": "Switchable contextually-based project",
          "bs": "aggregate real-time technologies"
        }
      },
      {
        "id": 10,
        "name": "Clementina DuBuque",
        "username": "Moriah.Stanton",
        "email": "[email protected]",
        "address": {
          "street": "Kattie Turnpike",
          "suite": "Suite 198",
          "city": "Lebsackbury",
          "zipcode": "31428-2261",
          "geo": {
            "lat": "-38.2386",
            "lng": "57.2232"
          }
        },
        "phone": "024-648-3804",
        "website": "ambrose.net",
        "company": {
          "name": "Hoeger LLC",
          "catchPhrase": "Centralized empowering task-force",
          "bs": "target end-to-end models"
        }
      }
    ]
    


    Repository

    고맙습니다.

    좋은 웹페이지 즐겨찾기