खोज…


वाक्य - विन्यास

  • func Marshal (v इंटरफ़ेस {}) ([] बाइट, त्रुटि)
  • func Unmarshal (डेटा [] बाइट, v इंटरफ़ेस {}) त्रुटि

टिप्पणियों

पैकेज "encoding/json" पैकेज जसन Go में JSON ऑब्जेक्ट्स की एन्कोडिंग और डिकोडिंग को लागू करता है।


JSON में गो में उनके संगत ठोस प्रकारों के प्रकार हैं:

JSON प्रकार गो कंक्रीट टाइप
बूलियन bool
संख्या फ्लोट64 या इंट
तार तार
शून्य शून्य

बेसिक JSON एन्कोडिंग

json.Marshal पैकेज "encoding/json" से JSON के मान को एन्कोड करता है।

पैरामीटर एनकोड करने का मान है। लौटे मान JSON- एन्कोडेड इनपुट (सफलता पर), और एक त्रुटि (विफलता पर) का प्रतिनिधित्व करने वाले बाइट्स की एक सरणी है।

decodedValue := []string{"foo", "bar"}

// encode the value
data, err := json.Marshal(decodedValue)

// check if the encoding is successful
if err != nil {
    panic(err)
}

// print out the JSON-encoded string
// remember that data is a []byte
fmt.Println(string(data))
// "["foo","bar"]"

खेल का मैदान

अंतर्निहित डेटा प्रकारों के लिए एन्कोडिंग के कुछ मूल उदाहरण यहां दिए गए हैं:

var data []byte

data, _ = json.Marshal(1)
fmt.Println(string(data))
// 1

data, _ = json.Marshal("1")
fmt.Println(string(data))
// "1"

data, _ = json.Marshal(true)
fmt.Println(string(data))
// true

data, _ = json.Marshal(map[string]int{"London": 18, "Rome": 30})
fmt.Println(string(data))
// {"London":18,"Rome":30}

खेल का मैदान

गो में JSON एन्कोडिंग कैसे काम करता है, यह समझने के लिए सरल चर एन्कोडिंग उपयोगी है। हालाँकि, वास्तविक दुनिया में, आप संभवतः अधिक जटिल डेटा को संरचित में संग्रहीत करेंगे।

बेसिक JSON डिकोडिंग

पैकेज "encoding/json" से json.Unmarshal दिए गए वैरिएबल द्वारा json.Unmarshal गए मान में JSON मान को डिकोड करता है।

मापदंडों को []bytes में डीकोड करने के लिए मूल्य है और डी-धारावाहिक मूल्य के लिए भंडारण के रूप में उपयोग करने के लिए एक चर है। लौटाया गया मान एक त्रुटि है (विफलता पर)।

encodedValue := []byte(`{"London":18,"Rome":30}`)

// generic storage for the decoded JSON
var data map[string]interface{}

// decode the value into data
// notice that we must pass the pointer to data using &data
err := json.Unmarshal(encodedValue, &data)

// check if the decoding is successful
if err != nil {
    panic(err)
}

fmt.Println(data)
map[London:18 Rome:30]

खेल का मैदान

ऊपर दिए गए उदाहरण में देखें कि हम पहले से ही कुंजी के प्रकार और मूल्य दोनों को जानते थे। पर यह मामला हमेशा नहीं होता। वास्तव में, ज्यादातर मामलों में JSON में मिश्रित मूल्य प्रकार होते हैं।

encodedValue := []byte(`{"city":"Rome","temperature":30}`)

// generic storage for the decoded JSON
var data map[string]interface{}

// decode the value into data
if err := json.Unmarshal(encodedValue, &data); err != nil {
    panic(err)
}

// if you want to use a specific value type, we need to cast it
temp := data["temperature"].(float64)
fmt.Println(temp) // 30
city := data["city"].(string)
fmt.Println(city) // "Rome"

खेल का मैदान

ऊपर के अंतिम उदाहरण में हमने डिकोड किए गए मूल्य को संग्रहीत करने के लिए एक सामान्य मानचित्र का उपयोग किया। हमें एक map[string]interface{} उपयोग करना चाहिए क्योंकि हम जानते हैं कि चाबियाँ तार हैं, लेकिन हम पहले से उनके मूल्यों के प्रकार को नहीं जानते हैं।

यह एक बहुत ही सरल तरीका है, लेकिन यह बेहद सीमित है। वास्तविक दुनिया में, आप आमतौर पर एक JSON को कस्टम-परिभाषित struct प्रकार में डिकोड करेंगे।

एक फाइल से JSON डेटा को डिकोड करना

JSON डेटा को फ़ाइलों से भी पढ़ा जा सकता है।

चलिए मान लेते हैं कि हमारे पास data.json नामक एक फाइल है जिसमें निम्नलिखित सामग्री है:

[
    {
      "Name" : "John Doe",
      "Standard" : 4
    },
    {
      "Name" : "Peter Parker",
      "Standard" : 11
    },
    {
      "Name" : "Bilbo Baggins",
      "Standard" : 150
    }
]

निम्न उदाहरण फ़ाइल को पढ़ता है और सामग्री को डीकोड करता है:

package main

import (
    "encoding/json"
    "fmt"
    "log"
    "os"
)

type Student struct {
    Name     string
    Standard int `json:"Standard"`
}

func main() {
    // open the file pointer
    studentFile, err := os.Open("data.json")
    if err != nil {
        log.Fatal(err)
    }
    defer studentFile.Close()

    // create a new decoder
    var studentDecoder *json.Decoder = json.NewDecoder(studentFile)
    if err != nil {
        log.Fatal(err)
    }

    // initialize the storage for the decoded data
    var studentList []Student
    
    // decode the data
    err = studentDecoder.Decode(&studentList)
    if err != nil {
        log.Fatal(err)
    }

    for i, student := range studentList {
        fmt.Println("Student", i+1)
        fmt.Println("Student name:", student.Name)
        fmt.Println("Student standard:", student.Standard)
    }
}

फ़ाइल data.json गो एक्जीक्यूटेबल प्रोग्राम की एक ही डायरेक्टरी में होना चाहिए। गो में फ़ाइलों के साथ काम करने के बारे में अधिक जानकारी के लिए गो फ़ाइल I / O प्रलेखन पढ़ें।

डिकोडिंग के लिए अनाम संरचनाओं का उपयोग करना

अनाम संरचना का उपयोग करने के साथ लक्ष्य केवल उस जानकारी को डीकोड करना है जिसके बारे में हम अपने ऐप को केवल एक फ़ंक्शन में उपयोग किए जाने वाले प्रकार के साथ लिटाने के बिना करते हैं।

jsonBlob := []byte(`
  {
    "_total": 1,
    "_links": {
      "self": "https://api.twitch.tv/kraken/channels/foo/subscriptions?direction=ASC&limit=25&offset=0",
      "next": "https://api.twitch.tv/kraken/channels/foo/subscriptions?direction=ASC&limit=25&offset=25"
    },
    "subscriptions": [
      {
        "created_at": "2011-11-23T02:53:17Z",
        "_id": "abcdef0000000000000000000000000000000000",
        "_links": {
          "self": "https://api.twitch.tv/kraken/channels/foo/subscriptions/bar"
        },
        "user": {
          "display_name": "bar",
          "_id": 123456,
          "name": "bar",
          "staff": false,
          "created_at": "2011-06-16T18:23:11Z",
          "updated_at": "2014-10-23T02:20:51Z",
          "logo": null,
          "_links": {
            "self": "https://api.twitch.tv/kraken/users/bar"
          }
        }
      }
    ]
  }
`)

var js struct {
    Total int `json:"_total"`
    Links struct {
        Next string `json:"next"`
    } `json:"_links"`
    Subs []struct {
        Created string `json:"created_at"`
        User    struct {
            Name string `json:"name"`
            ID   int    `json:"_id"`
        } `json:"user"`
    } `json:"subscriptions"`
}

err := json.Unmarshal(jsonBlob, &js)
if err != nil {
    fmt.Println("error:", err)
}
fmt.Printf("%+v", js)

आउटपुट: {Total:1 Links:{Next:https://api.twitch.tv/kraken/channels/foo/subscriptions?direction=ASC&limit=25&offset=25} Subs:[{Created:2011-11-23T02:53:17Z User:{Name:bar ID:123456}}]}

खेल का मैदान

सामान्य मामले के लिए यह भी देखें: http://stackoverflow.com/documentation/go/994/json/4111/encoding-decoding-go-structs

JSON संरचना क्षेत्रों को कॉन्फ़िगर करना

निम्नलिखित उदाहरण पर विचार करें:

type Company struct {
    Name     string
    Location string
}

कुछ फ़ील्ड्स छिपाएँ / छोड़ें

Revenue और Sales निर्यात करने के लिए, लेकिन उन्हें एन्कोडिंग / डिकोडिंग से छिपाएं, json:"-" उपयोग करें json:"-" या चर को लोअरकेस अक्षर से शुरू करने के लिए नाम बदलें। ध्यान दें कि यह चर को पैकेज के बाहर दिखाई देने से रोकता है।

type Company struct {
    Name     string `json:"name"`
    Location string `json:"location"`
    Revenue  int    `json:"-"`
    sales    int
}

खाली फील्ड्स को नजरअंदाज करें

Location को JSON में शामिल किए जाने से रोकने के लिए जब इसे इसके शून्य मान पर सेट किया जाए, तो json टैग में जोड़ें ,omitempty

type Company struct {
    Name     string `json:"name"`
    Location string `json:"location,omitempty"`
}

खेल के मैदान में उदाहरण

निजी क्षेत्रों के साथ मार्कशीट की संरचना

एक अच्छे डेवलपर के रूप में आपने निर्यातित और गैर-निर्यातित दोनों क्षेत्रों के साथ निम्नलिखित संरचना बनाई है:

type MyStruct struct {
    uuid string    
    Name string
}

खेल के मैदान में उदाहरण: https://play.golang.org/p/Zk94Il2ANZ

अब आप Marshal() इस संरचना को मान्य JSON में संग्रहित करना चाहते हैं जैसे कि etcd। हालांकि, बाद से uuid निर्यात नहीं किया है, json.Marshal() यह छोड़ देता है। क्या करें? अनाम संरचना और json.MarshalJSON() इंटरफ़ेस का उपयोग करें! यहाँ एक उदाहरण है:

type MyStruct struct {
    uuid string    
    Name string
}

func (m MyStruct) MarshalJSON() ([]byte, error {
    j, err := json.Marshal(struct {
        Uuid string
        Name string
    }{
        Uuid: m.uuid,
        Name: m.Name,
    })
    if err != nil {
           return nil, err
    }
    return j, nil
}

खेल के मैदान में उदाहरण: https://play.golang.org/p/Bv2k9GgbzE

गो स्ट्रक्चर्स का उपयोग करके एन्कोडिंग / डिकोडिंग

मान लेते हैं कि हमारे पास निम्नलिखित struct जो City प्रकार को परिभाषित करती है:

type City struct {  
    Name string  
    Temperature int  
}

हम encoding/json पैकेज का उपयोग करके सिटी मान को एनकोड / डिकोड कर सकते हैं।

सबसे पहले, हमें गो मेटाडेटा का उपयोग करने की आवश्यकता है ताकि एनकोडर को संरचनात्मक क्षेत्रों और JSON कुंजियों के बीच पत्राचार बता सकें।

type City struct {  
    Name string `json:"name"`  
    Temperature int `json:"temp"`  
    // IMPORTANT: only exported fields will be encoded/decoded  
    // Any field starting with a lower letter will be ignored  
}  

इस उदाहरण को सरल रखने के लिए, हम फ़ील्ड और कुंजियों के बीच एक स्पष्ट पत्राचार की घोषणा करेंगे। हालाँकि, आप json: में बताए अनुसार , json: मेटाडाटा के कई वेरिएंट का उपयोग कर सकते हैं।

महत्वपूर्ण: केवल निर्यात किए गए फ़ील्ड (कैपिटल नाम वाले फ़ील्ड) क्रमबद्ध / deserialized होंगे। उदाहरण के लिए, यदि आप फील्ड टी एम्परेशन का नाम देते हैं तो इसे अनदेखा कर दिया जाएगा भले ही आप json मेटाडेटा सेट करें।

एन्कोडिंग

City संरचना को एनकोड करने के लिए, json.Marshal उपयोग मूल उदाहरण के रूप में करें:

// data to encode  
city := City{Name: "Rome", Temperature: 30}  
 
// encode the data  
bytes, err := json.Marshal(city)  
if err != nil {  
    panic(err)  
}  
 
fmt.Println(string(bytes))  
// {"name":"Rome","temp":30} 

खेल का मैदान

डिकोडिंग

City संरचना को डिकोड करने के लिए, json.Unmarshal उपयोग मूल उदाहरण के रूप में करें:

// data to decode  
bytes := []byte(`{"name":"Rome","temp":30}`)  
 
// initialize the container for the decoded data  
var city City  
 
// decode the data  
// notice the use of &city to pass the pointer to city  
if err := json.Unmarshal(bytes, &city); err != nil {  
    panic(err)  
}  
 
fmt.Println(city)  
// {Rome 30} 

खेल का मैदान



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow