从js Map和String创建json字符串

时间:2017-06-24 19:55:28

标签: javascript json

我的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”}'。所以我可能不得不做一些不同的事情来字符串化地图,但我尝试的任何东西都没有用。

任何人都可以帮助我吗?

6 个答案:

答案 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);
  };