将带有字典的打字稿 class 对象转换为 JSON 字符串

Converting a typescript class object with dictionary to a JSON string

我正在寻找一种方法将带有字典的打字稿 class 转换为不带括号的 JSON 对象。

这是我的class

export class MediaTagRequest {
    tags: Map<string, string>; 
    constructor(tags: Map<string, string>) {
      this.tags = tags;
    }
}

我的实例化

   let tags = new Map<string, string>();
   tags.set("city", "Karachi");  

   let mediatagRequest = new MediaTagRequest(tags);
   const headers = { 'content-type': 'application/json'}   
   const body = JSON.stringify(Object.keys(mediatagRequest.tags.entries()));

我当前的输出:

[["city","Karachi"]]

我想要的输出:

{
    "tags": {
        "city": "Karachi"
    }
}

谁能帮帮我,谢谢。

您可以使用其中任何一个创建 object,然后使用它创建响应正文

选项 1

let jsonObject = {};
tags.forEach((value, key) => {  
    jsonObject[key] = value;
});

选项 2

let jsonObject = {};
for (let entry of tags.entries()) {
    jsonObject[entry[0]] = entry[1];
}

选项 3

let jsonObject = {};
for (let key of tags.keys()) {  
    jsonObject[key] = value;          
}

正在创建响应正文

const body = JSON.stringify({
    tags: jsonObject
});

您可以使用 Map#entries and Object.fromEntries 将地图直接转换为对象。

这是一个例子:

const m = new Map();

m.set("foo", "hello");
m.set("bar", "world");

const obj = Object.fromEntries(m.entries());

console.log(obj);

您可以进一步利用 the replacer parameter of JSON.stringify 在转换整个对象时直接执行此操作:

function mapReplacer(key: string | number | Symbol, value: any) {
  if (value instanceof Map) {
    return Object.fromEntries(value.entries());
  }
  
  return value;
}

class MediaTagRequest {
    tags: Map<string, string>; 
    constructor(tags: Map<string, string>) {
      this.tags = tags;
    }
}

let tags = new Map<string, string>();
tags.set("city", "Karachi");  

let mediatagRequest = new MediaTagRequest(tags);

console.log(JSON.stringify(mediatagRequest, mapReplacer))

Playground Link

JavaScript 演示:

function mapReplacer(key, value) {
  if (value instanceof Map) {
    return Object.fromEntries(value.entries());
  }
  
  return value;
}

class MediaTagRequest { 
    constructor(tags) {
      this.tags = tags;
    }
}

let tags = new Map();
tags.set("city", "Karachi");  

let mediatagRequest = new MediaTagRequest(tags);

console.log(JSON.stringify(mediatagRequest, mapReplacer))