Go   发布时间:2022-04-09  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Golang json 解析大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_674_0@背景:
最近在用iris做web端的时候,遇到了这么一个问题,前端传过来的json串如下:

{
    "Name": "jiankunking","Age": 12,"BlogArticles": { "one": { "Detail": "csdn blog","Author": "jiankunking","Urls": { "1": "http://blog.csdn.net/jiankunking/article/details/52143504","2": "http://blog.csdn.net/jiankunking/article/details/52@R_674_11284@302","3": "http://blog.csdn.net/jiankunking/article/details/45479105" } },"two": { "Detail": "CSDN BLOG","Author": "JIANKUNKING","Urls": { "1": "http://blog.csdn.net/jiankunking/article/details/52684722","2": "http://blog.csdn.net/jiankunking/article/details/78808978" } } } }
@H_674_0@我用如下的结构接收:

type Person struct {
        Name         String
        Age          int
        BlogArticles @H_879_94@map[String]interface{}
    }
    type BlogArticle struct {
        Detail String
        Author String
        Urls   @H_879_94@map[String]String
    }
@H_674_0@从json结构来看,结构Person中BlogArticles map值的结构均符合 结构BlogArticle ,那我是不是可以这么做呢?

blogArticle3 := person.blogArticles["one"].(BlogArticlE)
//此时输出person.blogArticles["one"]类型,可知,
//person.blogArticles["one"]是map[String]interface {}
//然,看起来结构一样,但map[String]interface {}与BlogArticle却无法转换
@H_674_0@答案是否定的,错误信息如下:

@H_674_0@那么正确的做法应该如何处理呢?在接收数据的时候,用如下结构接收:

type BlogArticle struct { Detail String Author String Urls @H_521_152@map[String]String }

    type PersonCorrect struct { Name String Age int BlogArticles @H_521_152@map[String]BlogArticle }
@H_674_0@这时输出person.blogArticles[“one”]的类型可知

fmt.Println(typeof(personCorrect.blogArticles["one"]))
//结果
//main.blogArticle
@H_674_0@演示代码如下:
https://github.com/jiankunking/backups/blob/master/decode.go

@H_674_0@那么,”encoding/json”到底是怎么反序列化的呢?
在decode结构注释中,找到以下介绍:

// Unmarshal parses the JSON-encoded data and stores the result // in the value pointed to by v. // // Unmarshal uses the inverse of the encodings that // Marshal uses,allocating maps,slices,and pointers as necessary, // with the following additional rules: // // To unmarshal JSON into a pointer,Unmarshal first handles the case of // the JSON being the JSON literal null. In that case,Unmarshal sets // the pointer to nil. Otherwise,Unmarshal unmarshals the JSON into // the value pointed at by the pointer. If the pointer is nil,Unmarshal // allocates a new value for it to point to. // // To unmarshal JSON into a value implemenTing the Unmarshaler interface, // Unmarshal calls that value's UnmarshalJSON method,including // when the input is a JSON null. // Otherwise,if the value implements encoding.TextUnmarshaler // and the input is a JSON quoted String,Unmarshal calls that value's // UnmarshalText method with the unquoted form of the String. // // To unmarshal JSON into a struct,Unmarshal matches incoming object // keys to the keys used by Marshal (either the struct field name or its tag), // preferring an exact match but also accepTing a case-insensitive match. // Unmarshal will only set exported fields of the struct. // // To unmarshal JSON into an interface value, // Unmarshal stores one of these in thE interface value: // // bool,for JSON Booleans // float64,for JSON numbers // String,for JSON Strings // []interface{},for JSON arrays // map[String]interface{},for JSON objects // nil for JSON null // // To unmarshal a JSON array into a slice,Unmarshal resets the slice length // to zero and then appends each element to the slice. // As a special case,to unmarshal an empty JSON array into a slice, // Unmarshal replaces the slice with a new empty slice. // // To unmarshal a JSON array into a Go array,Unmarshal decodes // JSON array elements into corresponding Go array elements. // If the Go array is smaller than the JSON array, // the additional JSON array elements are discarded. // If the JSON array is smaller than the Go array, // the additional Go array elements are set to zero values. // // To unmarshal a JSON object into a map,Unmarshal first establishes a map to // use. If the map is nil,Unmarshal allocates a new map. Otherwise Unmarshal // reuses the exisTing map,keeping exisTing entries. Unmarshal then stores // key-value pairs from the JSON object into the map. The map's key type must // either be a String,an Integer,or implement encoding.TextUnmarshaler. // // If a JSON value is not appropriate for a given target type, // or if a JSON number overflows the target type,Unmarshal // skips that field and completes the unmarshaling as best it can. // If no more serIoUs errors are encountered,Unmarshal returns // an UnmarshalTypeError describing the earliest such error. // // The JSON null value unmarshals into an interface,map,pointer,or slice // by setTing that Go value to nil. Because null is often used in JSON to mean // ``not present,'' unmarshaling a JSON null into any other Go type has no effect // on the value and produces no error. // // When unmarshaling quoted Strings,invalid UTF-8 or // invalid UTF-16 surrogate pairs are not treated as an error. // Instead,they are replaced by the Unicode replacement // character U+FFFD. //
@H_674_0@源码地址如下:
https://github.com/golang/go/blob/release-branch.go1.8/src/encoding/json/decode.go

@H_674_0@但并未说明当unmarshal a JSON object into a map时,如果map中的value是interface{}时,该如何处理。
具体处理代码可以看源码func Unmarshal(data []byte,v interface{}) error {}处理的整个流程。

@H_674_0@个人微信公众号:

大佬总结

以上是大佬教程为你收集整理的Golang json 解析全部内容,希望文章能够帮你解决Golang json 解析所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。