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
}
网友评论