首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

JSON 格式轉換完全指南:二維數組到標準 JSON 對象/數組的正確姿勢

     編輯:程式設計疑難解答

問題澄清

目標格式 {["environment":"正常"],["video":"正常"],...} 不是合法 JSON。JSON 只有兩種合法頂層結構:

  • 對象:{"key": "value", ...} —— 無序鍵值對集合
  • 數組:[{"key": "value"}, ...] —— 有序值序列

源數據結構

// 原始二維數組
var sourceArray = [
    ["environment", "正常"],
    ["video", "正常"],
    ["edfa", "正常"],
    ["servers", "正常"],
    ["network", "正常"],
    ["other", "正常"]
];

三種標準轉換目標

目標一:單一對象(鍵值映射)⭐ 最常用

var resultObject = {};
for (var i = 0; i < sourceArray.length; i++) {
    var pair = sourceArray[i];
    if (pair.length >= 2) {
        resultObject[pair[0]] = pair[1];
    }
}
// 結果:
// {
//   "environment": "正常",
//   "video": "正常",
//   "edfa": "正常",
//   "servers": "正常",
//   "network": "正常",
//   "other": "正常"
// }

目標二:對象數組(保留順序、支持重複鍵)

var resultArray = [];
for (var i = 0; i < sourceArray.length; i++) {
    var pair = sourceArray[i];
    if (pair.length >= 2) {
        var obj = {};
        obj[pair[0]] = pair[1];
        resultArray.push(obj);
    }
}
// 結果:
// [
//   {"environment": "正常"},
//   {"video": "正常"},
//   {"edfa": "正常"},
//   {"servers": "正常"},
//   {"network": "正常"},
//   {"other": "正常"}
// ]

目標三:Map 結構(ES6+,保留插入順序、鍵類型豐富)

var resultMap = new Map();
for (var i = 0; i < sourceArray.length; i++) {
    var pair = sourceArray[i];
    if (pair.length >= 2) {
        resultMap.set(pair[0], pair[1]);
    }
}
// 使用:resultMap.get('environment') → "正常"
// 序列化:JSON.stringify([...resultMap]) → 目標二格式

完整工具函數

/**
 * 二維數組轉標準 JSON
 * @param {Array} arr - [[key, value], ...]
 * @param {string} mode - 'object' | 'array' | 'map'
 * @returns {Object|Array|Map}
 */
function convert2DArrayToJSON(arr, mode = 'object') {
    if (!Array.isArray(arr)) throw new TypeError('輸入必須是數組');
    
    switch (mode) {
        case 'object':
            return arr.reduce((obj, pair) => {
                if (Array.isArray(pair) && pair.length >= 2) {
                    obj[pair[0]] = pair[1];
                }
                return obj;
            }, {});
            
        case 'array':
            return arr.reduce((arr, pair) => {
                if (Array.isArray(pair) && pair.length >= 2) {
                    var obj = {};
                    obj[pair[0]] = pair[1];
                    arr.push(obj);
                }
                return arr;
            }, []);
            
        case 'map':
            var map = new Map();
            arr.forEach(pair => {
                if (Array.isArray(pair) && pair.length >= 2) {
                    map.set(pair[0], pair[1]);
                }
            });
            return map;
            
        default:
            throw new Error('不支持的模式: ' + mode);
    }
}

// 使用示例
var objResult = convert2DArrayToJSON(sourceArray, 'object');
var arrResult = convert2DArrayToJSON(sourceArray, 'array');
console.log(JSON.stringify(objResult, null, 2));
console.log(JSON.stringify(arrResult, null, 2));

Java 後端對應處理

// Spring MVC 接收
@PostMapping("/convert")
public ResponseEntity convert(@RequestBody List> sourceArray) {
    // 轉為 Map
    Map result = sourceArray.stream()
        .filter(pair -> pair != null && pair.size() >= 2)
        .collect(Collectors.toMap(
            pair -> pair.get(0),
            pair -> pair.get(1),
            (v1, v2) -> v1 // 重複鍵保留首個
        ));
    return ResponseEntity.ok(result);
}

// Jackson 序列化輸出
// {"environment":"正常","video":"正常",...}

避坑指南

錯誤做法問題正確理解
想生成 {[...],[...]}語法錯誤,大括號內只能是鍵值對用對象 {...} 或數組 [{...},{...}]
鍵重複時期望保留所有對象鍵唯一,後者覆蓋前者用數組模式 [{k:v},{k:v}] 保留重複
直接 JSON.stringify(sourceArray)輸出 [["k","v"],["k","v"]] 非標準對象需先轉換結構再序列化
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved