我的REST控制器期望请求输入以下格式,它成功转换为包含Map和String作为参数的Java对象:
{
"myMap" : {
"key1": "value1",
"key2": "value2",
"key3": "value3"},
"myString": "string value"
}
我从html表单中获取数据:
var myMap = new Map();
var String = document.getElementById('String').value;
for (var i = 0 ; i<anArray.length ; i++){
var input = document.getElementsByClassName('input_' + (i+1));
for (var j = 0 ; j<3 ; j++){
if (input[j].checked){
myMap.set(input[j].name, input[j].id);
}
}
}
基本上,此代码归结为:
var myMap = new Map();
myMap.set("key1", "value1");
myMap.set("key2", "value2");
myMap.set("key3", "value3");
这导致包含{key1 =&gt;的地图value1,key2 =&gt; value2等}和一个String。我一直试图把它变成像这样的json字符串,但它似乎不起作用:
var myJson = {};
myJson.myMap = myMap;
myJson.myString = myString;
var json = JSON.stringify(myJson);
但是,我最终得到以下字符串:`{“myMap”:{},“String”:“myString”}'。所以我可能不得不做一些不同的事情来字符串化地图,但我尝试的任何东西都没有用。
任何人都可以帮助我吗?
答案 0 :(得分:5)
您可以编写一个简短的转换函数,将地图绘制成可以进行字符串化的对象。
console.clear()
function mapToObj(map){
const obj = {}
for (let [k,v] of map)
obj[k] = v
return obj
}
const myMap = new Map();
myMap.set("key1", "value1");
myMap.set("key2", "value2");
myMap.set("key3", "value3");
const myString = "string value"
const myJson = {};
myJson.myMap = mapToObj(myMap);
myJson.myString = myString;
const json = JSON.stringify(myJson);
console.log(json)
这个版本可能适用于Map存在但其他一些ES6构造不适用的版本(但这似乎是编辑器设置问题)。
console.clear()
function mapToObj(map){
var obj = {}
map.forEach(function(v, k){
obj[k] = v
})
return obj
}
var myMap = new Map();
myMap.set("key1", "value1");
myMap.set("key2", "value2");
myMap.set("key3", "value3");
var myString = "string value"
var myJson = {};
myJson.myMap = mapToObj(myMap);
myJson.myString = myString;
var json = JSON.stringify(myJson);
console.log(json)
答案 1 :(得分:2)
您可以使用Array.prototype.reduce
和点差表示法将您的地图简洁地转换为您需要的格式。
var myMap = new Map();
myMap.set("key1", "value1");
myMap.set("key2", "value2");
myMap.set("key3", "value3");
var myString = "string value";
function mapToObj (map) {
return [...map].reduce((acc, val) => {
acc[val[0]] = val[1];
return acc;
}, {});
}
const json = JSON.stringify({
myMap: mapToObj(myMap),
myString: myString
});
console.log(json);
答案 2 :(得分:2)
JSON字符串化具有对象,数组和函数的特殊行为。
例如:
JSON.stringify( function(){} ); // output: undefind
JSON.stringify( [2,undefined,function(){}, 5] ); //output: "[2,null,null,5]"
解决这个问题的一种方法是定义一个 toJSON()方法,它返回对象的JSON安全版本。
var myJson = {};
myJson.toJson = function() {
return { /* what ever you need*/}
}
第二,更简单,使用ES6语法:
JSON.stringify([...myMap]);
答案 3 :(得分:1)
使用ES6语法,尤其是如果您有嵌套映射(否则Idan Dagan's answer更简单),则可以使用 JSON.stringify()的 second >参数,reducer,如下:
JSON.stringify(myMap, (key, value) => (value instanceof Map ? [...value] : value));
答案 4 :(得分:0)
您可以按照以下方式初始化myMap而不是Map
myMap = {};
将元素设置为 -
if (input[j].checked){
myMap[input[j].name] = input[j].id;
}
最后,在转换时,您可以执行以下操作 -
myJSON = {};
myJSON.myMap = JSON.stringify(myMap);
myJSON.myString = "StringValue";
var json = JSON.stringify(myJSON);
答案 5 :(得分:0)
此hack可以完成工作(但这是全局替代,必须谨慎使用):
Map.prototype.toString = function() {
let result = {};
this.forEach((key, value) => { result[key] = value;});
return JSON.stringify(result);
};