Map 与 Json

个人觉得map与json很有意思呢,map与json可以实现互转

1、map是无序的,等同的数据,存储在map中、存储在json中,序列化json与序列化map是有不同结果的,举个栗子:

package MapByOrder

import (
	"encoding/base64"
	"fmt"
	"reflect"
	"encoding/json"
)

type Person struct{
	Name string `json:"name"`
	Phone string `json:"phone"`
	Number int64 `json:"number"`
}


func MapOrder(){
	
	var Persons []Person
	Persons = append(Persons,Person{
		Name:"lisa",
		Phone:"135000000000",
		Number:111,
	})
	Persons = append(Persons,Person{
		Name:"Michel",
		Phone:"137000000000",
		Number:222,
	})
	StrP_json, _:= json.Marshal(Persons)
	encodeString := base64.StdEncoding.EncodeToString(StrP_json)
	fmt.Printf("%v - %v\n encodeString: %v\n\n",reflect.TypeOf(Persons),Persons,string(encodeString))

	var MapPersons []interface{}
	var MapPerson1 = make(map[string]interface{})
	MapPerson1["name"] = "lisa"
	MapPerson1["phone"] = "135000000000"
	MapPerson1["number"] = 111

	var MapPerson2 = make(map[string]interface{})
	MapPerson2["name"] = "Michel"
	MapPerson2["phone"] = "137000000000"
	MapPerson2["number"] = 222

	MapPersons = append(MapPersons,MapPerson1)
	MapPersons = append(MapPersons,MapPerson2)

	MapP_json, _:= json.Marshal(MapPersons)
	encodeString2 := base64.StdEncoding.EncodeToString(MapP_json)
	fmt.Printf("%v - %v\n encodeString: %v\n\n",reflect.TypeOf(MapPersons),MapPersons,string(encodeString2))

	return 
}

然后输出结果是这样子的:

[]MapByOrder.Person - [{lisa 135000000000 111} {Michel 137000000000 222}]
 encodeString: W3sibmFtZSI6Imxpc2EiLCJwaG9uZSI6IjEzNTAwMDAwMDAwMCIsIm51bWJlciI6MTExfSx7Im5hbWUiOiJNaWNoZWwiLCJwaG9uZSI6IjEzNzAwMDAwMDAwMCIsIm51bWJlciI6MjIyfV0=

[]interface {} - [map[name:lisa phone:135000000000 number:111] map[name:Michel phone:137000000000 number:222]]
 encodeString: W3sibmFtZSI6Imxpc2EiLCJudW1iZXIiOjExMSwicGhvbmUiOiIxMzUwMDAwMDAwMDAifSx7Im5hbWUiOiJNaWNoZWwiLCJudW1iZXIiOjIyMiwicGhvbmUiOiIxMzcwMDAwMDAwMDAifV0=

尝试编译运行代码,可能每次的encodeString是不一样的

2、map转化成json,嵌套的数据也能正常解析,看下代码:

package  JsonParse

import (
	"fmt"
	"encoding/json"
)


type Parents struct{
	Father string `json:"father"`
	Mother string `json:"mother"`
}

type InnerJson struct{
	Name string `json:"name"`
	Age int `json:"age"`
	Relative Parents `json:"relative"` 
}

func JsonInner(){
	var value = make(map[string]interface{})
	value["name"] = "lisa"
	value["age"] = 16
	var subvalue = make(map[string]interface{})
	subvalue["father"] = "lisa-father"
	subvalue["mother"] = "lisa-mother"
	value["relative"] = subvalue

	var inner InnerJson
	bytesValue,_:=json.Marshal(value)
	json.Unmarshal(bytesValue,&inner)
	fmt.Printf("inner: %#v\n",inner)
}

然后,它的运行结果是这样子的:

inner: JsonParse.InnerJson{
	Name:"lisa", 
	Age:16, 
	Relative:JsonParse.Parents{
		Father:"lisa-father", 
		Mother:"lisa-mother"
		}
	}
在JavaScript中,MapJSON的相互转换方法如下: ### MapJSON - **方法一**:先将Map转化为Object,再使用`JSON.stringify()`将对象转为JSON字符串。示例代码如下: ```javascript function _strMapToObj(strMap) { let obj = Object.create(null); for (let [k, v] of strMap) { obj[k] = v; } return obj; } function _mapToJson(map) { return JSON.stringify(_strMapToObj(map)); } ``` - **方法二**:使用`Object.fromEntries()`方法将Map转为对象,再用`JSON.stringify()`将对象转为JSON字符串。示例代码如下: ```javascript const map = new Map([ ['name', '张三'], ['age', '18'], ['address', 'xian'] ]); const json = JSON.stringify(Object.fromEntries(map)); ``` - **方法三**:通过`forEach`将Map转为对象,再用`JSON.stringify()`将对象转为JSON字符串。示例代码如下: ```javascript function mapToJsonStr(map) { const obj = {}; map.forEach((v, k) => (obj[k] = v)); return JSON.stringify(obj); } ``` ### JSONMap - **方法一**:如果是JSON字符串,先使用`JSON.parse()`转为对象,再使用`Object.entries()`接受对象返回二维数组,最后调用`Map()`构造函数。示例代码如下: ```javascript let arr = Object.entries({"name":"张三","age":"18","address":"xian"}); let map = new Map(arr); ``` - **方法二**:先判断字符串是否为合法的JSON字符串,再将JSON字符串转为对象,最后将对象转为Map。示例代码如下: ```javascript const isJsonStr = (str) => { if (typeof str === 'string') { try { const obj = JSON.parse(str); if (typeof obj === 'object' && obj) { return true; } else { return false; } } catch (e) { return false; } } return false; }; const jsonStrToMap = (jsonStr) => { const jsonObj = JSON.parse(jsonStr); const map = new Map(); for (const k of Object.keys(jsonObj)) { map.set(k, jsonObj[k]); } return map; }; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值