从js Map和String创建json string

blpfk2vs  于 2023-06-25  发布在  其他
关注(0)|答案(7)|浏览(90)

我的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 => value1,key2 => value2,etc}和一个String的Map。我一直试图将其转换成像这样的JSON字符串,但似乎不起作用:

var myJson = {};
myJson.myMap = myMap;
myJson.myString = myString;
var json = JSON.stringify(myJson);

但是,我最终得到了以下字符串:`{"myMap ":{}," String ":" myString "}'。所以我可能需要做一些不同的事情来串一个Map,但我尝试没有任何工作。
有人能帮帮我吗?

woobm2wo

woobm2wo1#

你可以写一个简短的转换函数,把Map变成一个可以被字符串化的对象。

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)
i2loujxw

i2loujxw2#

使用ES6语法,特别是如果你有嵌套Map(否则Idan Dagan's answer会更简单),你可以使用 JSON.stringify()第二个参数,reducer,如下所示:

JSON.stringify(myMap, (key, value) => (value instanceof Map ? [...value] : value));
qojgxg4l

qojgxg4l3#

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]);
rvpgvaaj

rvpgvaaj4#

您可以使用Array.prototype.reduce和扩展符号来简洁地将Map转换为所需的格式。

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);
1aaf6o9v

1aaf6o9v5#

这个黑客可以完成这项工作(但它是一个全局覆盖,必须小心使用):

Map.prototype.toString = function() {

    let result = {};

    this.forEach((key, value) => { result[key] = value;});

    return JSON.stringify(result);
  };
mw3dktmi

mw3dktmi6#

您可以按如下方式初始化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);
lrpiutwd

lrpiutwd7#

这是es6中最好的方法

JSON.stringify(Object.fromEntries(atlasIdById))

相关问题