背景:
最近在用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/52673302","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" } } } }

我用如下的结构接收:

type Person struct {
        Name         
        Age          int
        BlogArticles @H_569_94@map[]interface{}
    }
    type BlogArticle struct {
        Detail 
        Author 
        Urls   @H_569_94@map[]
    }

从json结构来看,结构Person中BlogArticles map值的结构均符合 结构BlogArticle ,那我是不是可以这么做呢?

blogArticle3 := person.blogArticles["one"].(BlogArticlE)
//此时输出person.blogArticles["one"]类型,可知,
//person.blogArticles["one"]是map[String]interface {}
//虽然,看起来结构一样,但map[String]interface {}与BlogArticle却无法转换

答案是否定的,错误信息如下:

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

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

    type PersonCorrect struct { Name  Age int BlogArticles @H_788_152@map[]BlogArticle }

这时输出person.blogArticles[“one”]的类型可知:

fmt.Println(typeof(personCorrect.blogArticles["one"]))
//结果
//main.blogArticle

那么,”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. //

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

个人微信公众号:

大佬总结

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

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

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