헤이 마샬
15127 단어 tutorialprogramminggoopensource
프로젝트를 만들기 전에 다른 문제에 대해 간단히 이야기합시다. 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 명령이 필요하지 않습니다.
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 명령이 필요하지 않습니다.
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"`
}
//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)
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)
}
일부 정보를 표시하거나 클라이언트로부터 입력을 받는 데 사용하는 "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
고맙습니다.
Reference
이 문제에 관하여(헤이 마샬), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/bseyhan/hey-marshal-1134텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)