zoukankan      html  css  js  c++  java
  • 幽灵蛛(pholcus)(五)--json解析学习资料

    在爬虫过程中尤其是ajax一般返回的json格式的数据,这个时候就需要用到json来进行解析。

    转载请注明:http://www.cnblogs.com/SSSR/p/6347596.html

    博客:

    http://studygolang.com/articles/7470 Marshal和unMarshal方法

    http://studygolang.com/articles/52 golang的json操作

    jsonlearn.go

    package jsonlearning
    
    import "encoding/json"
    import "fmt"
    import "os"
    
    type Response1 struct {
    	Page   int
    	Fruits []string
    }
    type Response2 struct {
    	Page   int      `json:"page"`
    	Fruits []string `json:"fruits"`
    }
    
    func Json() {
    	//首先我们来看一下基本数据类型到 JSON 字符串的编码过程。这里是一些原子值的例子。
    	bolB, _ := json.Marshal(true)
    	fmt.Println(string(bolB))
    	intB, _ := json.Marshal(1)
    	fmt.Println(string(intB))
    	fltB, _ := json.Marshal(2.34)
    	fmt.Println(string(fltB))
    	strB, _ := json.Marshal("gopher")
    	fmt.Println(string(strB))
    	//这里是一些切片和 map 编码成 JSON 数组和对象的例子。
    	slcD := []string{"apple", "peach", "pear"}
    	slcB, _ := json.Marshal(slcD)
    	fmt.Println(string(slcB))
    	mapD := map[string]int{"apple": 5, "lettuce": 7}
    	mapB, _ := json.Marshal(mapD)
    	fmt.Println(string(mapB))
    	//JSON 包可以自动的编码你的自定义类型。编码仅输出可导出的字段,并且默认使用他们的名字作为 JSON 数据的键。
    	res1D := &Response1{
    		Page:   1,
    		Fruits: []string{"apple", "peach", "pear"}}
    	res1B, _ := json.Marshal(res1D)
    	fmt.Println(string(res1B))
    	//你可以给结构字段声明标签来自定义编码的 JSON 数据键名称。在上面 Response2 的定义可以作为这个标签这个的一个例子。
    	res2D := &Response2{
    		Page:   1,
    		Fruits: []string{"apple", "peach", "pear"}}
    	res2B, _ := json.Marshal(res2D)
    	fmt.Println(string(res2B))
    	//现在来看看解码 JSON 数据为 Go 值的过程。这里是一个普通数据结构的解码例子。
    	byt := []byte(`{"num":6.13,"strs":["a","b"]}`)
    	//我们需要提供一个 JSON 包可以存放解码数据的变量。这里的map[string]interface{} 将保存一个 string 为键,值为任意值的map。
    	var dat map[string]interface{}
    	//这里就是实际的解码和相关的错误检查。
    	if err := json.Unmarshal(byt, &dat); err != nil {
    		panic(err)
    	}
    	fmt.Println(dat)
    	//为了使用解码 map 中的值,我们需要将他们进行适当的类型转换。例如这里我们将 num 的值转换成 float64类型。
    	num := dat["num"].(float64)
    	fmt.Println(num)
    	//访问嵌套的值需要一系列的转化。
    	strs := dat["strs"].([]interface{})
    	str1 := strs[0].(string)
    	fmt.Println(str1)
    	//我们也可以解码 JSON 值到自定义类型。这个功能的好处就是可以为我们的程序带来额外的类型安全加强,并且消除在访问数据时的类型断言。
    	str := `{"page": 1, "fruits": ["apple", "peach"]}`
    	res := &Response2{}
    	json.Unmarshal([]byte(str), &res)
    	fmt.Println(res)
    	fmt.Println(res.Fruits[0])
    	//在上面的例子中,我们经常使用 byte 和 string 作为使用标准输出时数据和 JSON 表示之间的中间值。我们也可以和os.Stdout 一样,直接将 JSON 编码直接输出至 os.Writer流中,或者作为 HTTP 响应体。
    	enc := json.NewEncoder(os.Stdout)
    	d := map[string]int{"apple": 5, "lettuce": 7}
    	enc.Encode(d)
    }
    
    
    type ConfigStruct struct {
        Host              string   `json:"host"`
        Port              int      `json:"port"`
        AnalyticsFile     string   `json:"analytics_file"`
        StaticFileVersion int      `json:"static_file_version"`
        StaticDir         string   `json:"static_dir"`
        TemplatesDir      string   `json:"templates_dir"`
        SerTcpSocketHost  string   `json:"serTcpSocketHost"`
        SerTcpSocketPort  int      `json:"serTcpSocketPort"`
        Fruits            []string `json:"fruits"`
    }
     
    type Other struct {
        SerTcpSocketHost string   `json:"serTcpSocketHost"`
        SerTcpSocketPort int      `json:"serTcpSocketPort"`
        Fruits           []string `json:"fruits"`
    }
     
    func JsonTranslate() { 
        jsonStr := `{"host": "http://localhost:9090","port": 9090,"analytics_file": "","static_file_version": 1,"static_dir": "E:/Project/goTest/src/","templates_dir": "E:/Project/goTest/src/templates/","serTcpSocketHost": ":12340","serTcpSocketPort": 12340,"fruits": ["apple", "peach"]}`
     
        //json str 转map
        var dat map[string]interface{}
        if err := json.Unmarshal([]byte(jsonStr), &dat); err == nil {
            fmt.Println("==============json str 转map=======================")
            fmt.Println(dat)
            fmt.Println(dat["host"])
        }
     
        //json str 转struct
        var config ConfigStruct
        if err := json.Unmarshal([]byte(jsonStr), &config); err == nil {
            fmt.Println("================json str 转struct==")
            fmt.Println(config)
            fmt.Println(config.Host)
        }
     
        //json str 转struct(部份字段)
        var part Other
        if err := json.Unmarshal([]byte(jsonStr), &part); err == nil {
            fmt.Println("================json str 转struct==")
            fmt.Println(part)
            fmt.Println(part.SerTcpSocketPort)
        }
     
        //struct 到json str
        if b, err := json.Marshal(config); err == nil {
            fmt.Println("================struct 到json str==")
            fmt.Println(string(b))
        }
     
        //map 到json str
        fmt.Println("================map 到json str=====================")
        enc := json.NewEncoder(os.Stdout)
        enc.Encode(dat)
     
        //array 到 json str
        arr := []string{"hello", "apple", "python", "golang", "base", "peach", "pear"}
        lang, err := json.Marshal(arr)
        if err == nil {
            fmt.Println("================array 到 json str==")
            fmt.Println(string(lang))
        }
     
        //json 到 []string
        var wo []string
        if err := json.Unmarshal(lang, &wo); err == nil {
            fmt.Println("================json 到 []string==")
            fmt.Println(wo)
        }
    }
    

      jsonlearn_test.go

    package jsonlearning
    
    import "fmt"
    import "testing"
    
    func TestJson(t *testing.T) {
    	Json()
    	fmt.Println("Hello World!这是测试")
    }
    
    func TestJsonTranslate(t *testing.T) {
    	JsonTranslate()
    	fmt.Println("Hello World!这是测试")
    }
    

      

  • 相关阅读:
    SpringBoot入门之基于XML的Mybatis
    SpringBoot入门之基于注解的Mybatis
    自定义Fiddler插件二
    SpringBoot入门之集成JSP
    SpringBoot入门之Thymeleaf的使用
    自定义Fiddler插件一
    SpringBoot入门之简单配置
    Eclipse引入SpringBoot
    SpringMVC之数据传递三Ajax与Controller交互
    SpringMVC之拦截器实现登录验证
  • 原文地址:https://www.cnblogs.com/SSSR/p/6347596.html
Copyright © 2011-2022 走看看