美文网首页
自定义封装JSON

自定义封装JSON

作者: mick_ | 来源:发表于2019-04-29 13:07 被阅读0次
package main

import (

"bytes"

"fmt"

"reflect"

"strconv"

)

type People struct{

Name string `json:"name" description:"this is user name"`

  Age  int `json:"age" description:"this is user age"`

}

type Company struct{

Name string  `json:"name" description:"this is company name"`

  Addr string  `json:"addr" description:"this is company addr"`

  Users []People

}

func main(){

c :=Company{

Name:"爱数智慧",

      Addr:"西直门",

      Users:[]People{

{"A",1},

        {"B",2},

        {"C",3},

      },

  }

if res,err :=MyJson(c);err !=nil{

fmt.Println(err)

}else{

fmt.Println(res)

}

}

func MyJson(data interface{})(string,error){

var b bytes.Buffer

  if err :=writeJsonData(&b,reflect.ValueOf(data));err !=nil{

return "",err

  }else{

return b.String(),nil

  }

}

func writeJsonData(b *bytes.Buffer,value reflect.Value)error{

switch value.Kind(){

case reflect.String:

b.WriteString(strconv.Quote(value.String()))

case reflect.Int:

b.WriteString(strconv.FormatInt(value.Int(),10))

case reflect.Slice:

return writeSlice(b,value)

case reflect.Struct:

return writeStruct(b,value)

}

return nil

}

func writeStruct(b *bytes.Buffer,value reflect.Value)(err error){

structLen :=value.NumField()

valueType :=value.Type()

b.WriteString("{")

for i:=0;i

b.WriteString(strconv.Quote(valueType.Field(i).Name)+":")

fieldValue :=value.Field(i)

err =writeJsonData(b,fieldValue)

if err !=nil{

return err

      }

if i

b.WriteString(",")

}

}

b.WriteString("}")

return

}

func writeSlice(b *bytes.Buffer,value reflect.Value)(err error){

sliceLen :=value.Len()

b.WriteString("[")

for i:=0;i

val :=value.Index(i)

err =writeJsonData(b,val)

if err !=nil{

return err

      }

if i

b.WriteString(",")

}

}

b.WriteString("]")

return nil

}

相关文章

网友评论

      本文标题:自定义封装JSON

      本文链接:https://www.haomeiwen.com/subject/wflynqtx.html