Go parsing JSON

Source: Internet
Author: User
Tags custom name

JSON (Javascript Object Notation) is a lightweight data exchange language that is text-based, self-descriptive and easy to read. Although JSON is a subset of JavaScript, JSON is a language-independent text format and uses some of the same habits as the C language family. The biggest difference between JSON and XML is that XML is a complete markup language, and JSON is not. JSON is smaller, faster, easier to parse than XML, and the browser's built-in fast parsing support makes it more suitable for network data transmission. Parse to structthe JSON package for Go has the following function
Json.gopackage mainimport ("Encoding/json" "FMT") type Server struct {ServerName Stringserverip   string}type serverslice struct {Servers []server}func main () {var s serverslicestr: = ' {"Servers": [{"ServerName": "Shanghai_vpn", " ServerIP ":" 127.0.0.1 "},{" ServerName ":" Beijing_vpn "," ServerIP ":" 127.0.0.2 "}]} ' JSON. Unmarshal ([]byte (str), &s) fmt. Println (s) fmt. Println (S.servers[0]. ServerIP)}
Outputs:{[{Shanghai_vpn 127.0.0.1} {Beijing_vpn 127.0.0.2}]}127.0.0.1First, we define the structure corresponding to the JSON data, the array corresponds to the slice, the field name corresponds to the key in the JSON, how to match the JSON data with the struct field when parsing? If the JSON key is Foo, then how to find the corresponding field?
    • First, look for the exportable struct field with the tag foo (first capitalization)
    • Second, find the field name is Foo's export field
    • Finally look for an export field such as Foo or foo that is not sensitive to case except the first letter
the field that can be assigned must be an exportable field (that is, the first letter capitalized). At the same time, the JSON parsing will only parse the fields that can be found, if the missing fields are ignored, one of the benefits is that when you receive a large JSON data structure and you just want to get some of the data, you can easily solve the problem by capitalizing the field name of the data you want. parsing to interfacewe know that interface{} can be used to store objects of any data type, which is exactly the result of storing JSON data for an unknown structure that is parsed. The JSON package uses map[string]interface{} and the []interface{} structure to store any JSON objects and arrays. The corresponding relationship between the go type and the JSON type is as follows:
    • BOOL stands for JSON Booleans
    • Float64 on behalf of JSON numbers
    • String represents the JSON strings
    • NIL stands for JSON null
access the data by asserting, as in the following example:
Tointer.gopackage mainimport ("Encoding/json" "FMT") func main () {b: = []byte (' {"Name": "Wednesday", "Age": 6, "parents" : ["Gomez", "Moticia"]} ') var f interface{}err: = json. Unmarshal (b, &f) if err! = Nil {fmt. PRINTLN (err)}m: = f. (map[string]interface{}) for k, V: = range m {Switch VV: = V. (type) {case string:fmt. Println (k, ' is String ', vv) case int:fmt. Println (K, "is Int.", VV) case []INTERFACE{}:FMT. Println (K, "is a array:") for I, U: = Range VV {fmt. Println (i, u)}default:fmt. Println (K, "is of a type I don ' t know how to Handle")}}
Outputs:Name is string WednesdayAge was of a type I don ' t know how to handleparents is an array:0 Gomez1 MoticiaAs you can see from the example above, we can parse the JSON function of the unknown structure by interface{} with the type Assert. Generate JSONif we want to output a JSON data string, we can use the marshal function to handle
Func Marshal (v interface{}) ([]byte, error)
Example:
Generaljsonpackage mainimport ("Encoding/json" "FMT") type Server struct {ServerName string ' JSON: ' ServerName ' ServerIP   string ' JSON: ' ServerIP ' '}type serverslice struct {Servers []server ' JSON: ' Servers ' '}func main () {var s Serverslices.servers = Append (S.servers, server{servername: "Shanghai_vpn", ServerIP: "127.0.0.1"}) S.servers = append ( S.servers, Server{servername: "Beijing_vpn", ServerIP: "127.0.0.2"}) b, err: = json. Marshal (s) if err! = Nil {fmt. PRINTLN ("JSON err:", err)}fmt. Println (string (b))}
Outputs:{"Servers": [{"ServerName": "Shanghai_vpn", "ServerIP": "127.0.0.1"}, {"ServerName": "Beijing_vpn", "ServerIP": " 127.0.0.2 "}]}for JSON output, we need to be aware of several points when defining a struct tag:  
    • The field tag is "-", then this field is not output to JSON
    • With a custom name in the tag, the custom name appears in the field name of the JSON, such as the ServerName in the example above
    • If there is a "omitempty" option in the tag, then if the field value is empty, it will not be exported to the JSON string.
    • If the field type is Bool,string,int,int64, and the tag has a "string" option, the field will convert the value of the field to a JSON string when it is output to JSON.
Example:
Jsontest.gopackage mainimport ("Encoding/json" "OS") type Server struct {//id will not be exported to Jsonid int ' JSON: "-" '// The value of ServerName is two times JSON encoded serverName  string ' JSON: "ServerName" ' ServerName2 string ' JSON: "ServerName2, String" '// If ServerIP is empty, it is not exported to JSON ServerIP    string ' JSON: "Serverip,omitempty" ' Description string ' JSON: "Description, String "'}func main () {s: = Server{id:          3,servername:  ' Go ' 1.0" ', ServerName2: ' Go ' 1.0 "', ServerIP:    ', Description: ' Description information ',}b, _: = json. Marshal (s) os. Stdout.write (b)}
Outputs:{"ServerName": "Go \" 1.0\ "", "serverName2": "Go \" 1.0\ ""}The marshal function only returns data when the conversion is successful, and we need to note several points during the conversion process: 
    • The JSON object only supports string as key, so to encode a map, it must be a type map[string]t (T is any type in the Go language)
    • Channel,complex and function cannot be encoded into JSON.
    • Nested data cannot be encoded, otherwise JSON encoding goes into a dead loop
    • The pointer outputs the contents of the pointer as it is encoded, and the null pointer outputs null
at present bitly company Open source A package called Simplejson, in dealing with the unknown structure of JSON is quite convenient, address:Https://github.com/bitly/go-simplejson

Go parsing JSON

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.