Json - stringify เพื่อให้อาร์เรย์อยู่ในบรรทัดเดียว

เป็นไปได้หรือไม่ที่จะสตริงวัตถุ JSON ให้มีลักษณะเช่นนี้ โดยมีอาร์เรย์อยู่ในบรรทัดเดียว - ไม่มีการเยื้อง

{
    "Repeat": {
        "Name": [["Top_level","All"],[[1,1]]],
        "Link": [["Top_level"],[[1,1]]]
    },
    "Delete": ["Confirm","Cancel"],
    "Move": ["Up","Down"],
    "Number": ["Ascending","Descending"]
}

person Chris Glasier    schedule 04.08.2011    source แหล่งที่มา


คำตอบ (10)


ลองสิ่งนี้:

var obj = {"Repeat": {"Name":[["Top_level","All"],[[1,1]]],"Link": [["Top_level"],[[1,1]]]},"Delete": ["Confirm","Cancel"],"Move": ["Up","Down"],"Number": ["Ascending","Descending"]};

JSON.stringify(obj,function(k,v){
   if(v instanceof Array)
      return JSON.stringify(v);
   return v;
},2);

ผลลัพธ์:

"{
  "Repeat": {
    "Name": "[[\"Top_level\",\"All\"],[[1,1]]]",
    "Link": "[[\"Top_level\"],[[1,1]]]"
  },
  "Delete": "[\"Confirm\",\"Cancel\"]",
  "Move": "[\"Up\",\"Down\"]",
  "Number": "[\"Ascending\",\"Descending\"]"
}"
person ericbowden    schedule 26.08.2013
comment
ขอบคุณที่ดูเหมือนมันควรจะเป็นมากกว่านี้ ฉันจะลองดูในเวลาที่เหมาะสม เคทำอะไร? - person Chris Glasier; 28.08.2013
comment
k และ v เป็นคีย์/ค่าสำหรับอ็อบเจ็กต์ที่ถูกส่งผ่านไปยังฟังก์ชันนั้น ในกรณีนี้ k จะไม่ทำอะไรเลย - person ericbowden; 29.08.2013
comment
อาร์เรย์ออกมาเป็นสตริงเดี่ยว มีวิธีที่ชาญฉลาดพอ ๆ กันในการส่งคืนไปยังอาร์เรย์หรือไม่? ถ้าเป็นเช่นนั้นคำตอบของคุณก็ถูกอย่างแน่นอน - person Chris Glasier; 11.11.2013
comment
มันพิมพ์ออกมาดังนี้:` รูปภาพ: [\2\,\3\,\4\,\5\,\6\,\7\]` - person Chris Glasier; 22.11.2013
comment
ส่วนนี้จะยุ่งยากเล็กน้อย สิ่งที่ฉันทำเมื่อนำไปใช้คือการดึงเครื่องหมายคำพูดและแบ็กสแลชด้วย regex ออก สำหรับอาร์เรย์ คุณสามารถสร้างเมธอดแบบเรียกซ้ำซึ่งจะวนซ้ำทุกครั้งที่ตรวจพบอาร์เรย์และตรึงไว้ที่ส่วนท้ายของสตริงเอาต์พุต จากที่นี่มันอาจจะยุ่งนิดหน่อย - person ericbowden; 29.11.2013
comment
ดูเหมือนว่า regex จะใช้ได้ แต่อาร์เรย์อาจมีสตริง ดังนั้นจะต้องเป็นแบ็กสแลช [ และ ] ... จะลองดู ... ทั้งหมดนี้ในเวลาที่ดี! - person Chris Glasier; 01.12.2013
comment
ดูเหมือนว่าจะเพิ่มปัญหาเครื่องหมายวรรคตอนออกไป:html = html.split('"[').join("["); html = html.split(']"').join("]"); html = html.split('\\"').join('"'); html = html.split('""').join('"'"'"); - person Chris Glasier; 26.09.2014

หากคุณต้องการแสดงอาร์เรย์แบบสั้นเป็นบรรทัดเดียว ให้ลองใช้ json-stringify-pretty- กะทัดรัด. มันให้ผลลัพธ์ดังนี้:

{
  "bool": true,
  "short array": [1, 2, 3],
  "long array": [
    {"x": 1, "y": 2},
    {"x": 2, "y": 1},
    {"x": 1, "y": 1},
    {"x": 2, "y": 2}
  ]
}
person Piotr Migdal    schedule 15.11.2015
comment
มันใช้งานได้ค่อนข้างดีเมื่อคุณได้มันไป มันเป็นกระบวนการที่แปลก - หรือบางทีฉันไม่รู้ว่ากำลังทำอะไรอยู่ ... มันติดตั้งได้อย่างง่ายดายด้วย npm หลังจากนั้น เพื่อให้มันทำงานได้ แท็กสคริปต์ของคุณต้องชี้ไปที่ 'index.js' (ไม่มีไฟล์ json-stringify-pretty-compact js) จากนั้นคุณจะต้องแสดงความคิดเห็นในบรรทัดสุดท้าย ดังนี้: //module.exports = stringify จากนั้นคุณสามารถใช้แทน JSON.stringify ได้ดังนี้: stringify(jSONObject, null, 2) แน่นอนว่ามันทำให้ JSON ดูดีขึ้นมาก - person Travis Heeter; 04.11.2016

รับคำตอบจาก ericbowden และ ใหญ่มาก ฉันสร้างฟังก์ชันด้านล่างขึ้นมาซึ่งช่วยให้ฉันพิมพ์ JSON ได้สวยโดยยังคงรักษาอาร์เรย์ไว้ในบรรทัดเดียวและเก็บอาร์เรย์ไว้ในรูปแบบอาร์เรย์แทนที่จะแปลงเป็นสตริง

function prettyPrintArray(json) {
  if (typeof json === 'string') {
    json = JSON.parse(json);
  }
  output = JSON.stringify(json, function(k,v) {
    if(v instanceof Array)
      return JSON.stringify(v);
    return v;
  }, 2).replace(/\\/g, '')
        .replace(/\"\[/g, '[')
        .replace(/\]\"/g,']')
        .replace(/\"\{/g, '{')
        .replace(/\}\"/g,'}');

  return output;
}
person Alexis Evelyn    schedule 28.02.2019
comment
ขอบคุณสำหรับคำตอบของคุณ - มันใช้งานได้ดี ที่นี่ฉันได้ปรับฟังก์ชันของคุณให้ผ่าน JSLint: const prettyPrintArray = obj => JSON.stringify( obj, (key, val) => (val instanceof Array) ? JSON.stringify(val) : val, 2).replace(/\\/g, '').replace(/\[/g, '[').replace(/\]/g,']').replace(/\{/g, '{').replace(/\}/g,'}'); - person LukeT; 09.06.2020

อีกแนวทางหนึ่งที่ฉันใช้:

obj => JSON.stringify(obj, (k,v) => Array.isArray(v) ? JSON.stringify(v) : v, 2)
.replace(/"\[[^"\]]*]"/g, r => JSON.stringify(JSON.parse(r)).substr(1).slice(0,-1))

*อาร์เรย์ต้องไม่มีสตริง (สังเกตว่า " ในส่วนไม่มีอยู่ภายใน regex) หากคุณลบออก มันจะจับคีย์ ค่าของ: "[": "[1,2,3,4]",

อัปเดต 2020-03 - ฉันหาวิธีแก้ปัญหาที่เสถียรกว่านี้แล้ว

const obj = {
  "first_name": "John",
  "last_name": "Smith",
  "age": 21,
  "hobbies": [ "programming", "workout", null, undefined, 24, "\"has double quotes\"" ],
  "nested": {
    "arr": [ "one", "two", "three" ],
  },
  "nested_arr": [
    "first as string",
    {
      "latin": [ "alpha", "beta", "[gamma]" ]
    },
    null
  ]
};

const stringify = (obj, indent = 2) => 
  JSON.stringify(obj, (key, value) => {
    if (Array.isArray(value) && !value.some(x => x && typeof x === 'object')) {
      return `\uE000${JSON.stringify(value.map(v => typeof v === 'string' ? v.replace(/"/g, '\uE001') : v))}\uE000`;
    }
    return value;
  }, indent).replace(/"\uE000([^\uE000]+)\uE000"/g, match => match.substr(2, match.length - 4).replace(/\\"/g, '"').replace(/\uE001/g, '\\\"'));

console.log(stringify(obj));

person EliSherer    schedule 14.11.2017
comment
คุณคิดว่าจะได้ผลลัพธ์นี้หรือไม่: www.glasier.hk - เลือก JSON - person Chris Glasier; 15.11.2017
comment
เพื่อจุดประสงค์ทั่วไปที่สวยงาม ฉันขอแนะนำให้ใช้ห้องสมุดบุคคลที่สามตามที่แนะนำโดย @Piotr Migdal - person EliSherer; 15.11.2017

โปรดทราบว่าสิ่งนี้ใช้ lodash เพื่อตรวจจับอาร์เรย์และวัตถุ นี่เป็นอีกวิธีหนึ่งที่จะทำให้วัตถุ "ลีฟ" กระชับอยู่ในบรรทัดเดียว:

_.jsonPretty = function(obj, indent) {
    if(!indent) indent = 2;

    return JSON.stringify(obj, function(k,v) {
        //Check if this is a leaf-object with no child Arrays or Objects:
        for(var p in v) {
            if(_.isArray(v[p]) || _.isObject(v[p])) {
                return v;
            }
        }

        return JSON.stringify(v);

        //Cleanup the escaped strings mess the above generated:
    }, indent).replace(/\\/g, '')
        .replace(/\"\[/g, '[')
        .replace(/\]\"/g,']')
        .replace(/\"\{/g, '{')
        .replace(/\}\"/g,'}');
};

และเพียงใช้มันเช่นนี้:

_.jsonPretty(yourObjectToStringify);

นี่คือตัวอย่าง ก่อน...

{
  "type": "light-item",
  "name": "Waiting",
  "ringSeqLooping": true,
  "ringSeqHoldLast": false,
  "ringSteps": [
    {
      "type": "light-step",
      "time": 1,
      "audioClipName": "Off",
      "audioVolume": 1,
      "lights": [
        {
          "state": "FadeOn",
          "color": "#fff"
        },
        {
          "state": "Off",
          "color": "#fff"
        },
        {
          "state": "Off",
          "color": "#fff"
        },
        {
          "state": "Off",
          "color": "#fff"
        },
        {
          "state": "Off",
          "color": "#fff"
        },
        {
          "state": "Off",
          "color": "#fff"
        },
        {
          "state": "Off",
          "color": "#fff"
        },
        {
          "state": "Off",
          "color": "#fff"
        }
      ]
    },
    {
      "type": "light-step",
      "time": "0.5",
      "audioClipName": "Off",
      "audioVolume": 1,
      "lights": [
        {
          "state": "FadeOff",
          "color": "#fff"
        },
        {
          "state": "Off",
          "color": "#fff"
        },
        {
          "state": "Off",
          "color": "#fff"
        },
        {
          "state": "Off",
          "color": "#fff"
        },
        {
          "state": "Off",
          "color": "#fff"
        },
        {
          "state": "Off",
          "color": "#fff"
        },
        {
          "state": "Off",
          "color": "#fff"
        },
        {
          "state": "Off",
          "color": "#fff"
        }
      ]
    }
  ],
  "stripSeqLooping": true,
  "stripSeqHoldLast": false,
  "stripSteps": [
    {
      "type": "light-step",
      "time": "2",
      "audioClipName": "Off",
      "audioVolume": 1,
      "lights": [
        {
          "state": "Off",
          "color": "#fff"
        },
        {
          "state": "Off",
          "color": "#fff"
        },
        {
          "state": "Off",
          "color": "#fff"
        },
        {
          "state": "FadeOn",
          "color": "#fff"
        },
        {
          "state": "FadeOn",
          "color": "#fff"
        },
        {
          "state": "Off",
          "color": "#fff"
        },
        {
          "state": "Off",
          "color": "#fff"
        },
        {
          "state": "Off",
          "color": "#fff"
        }
      ]
    },
    {
      "type": "light-step",
      "time": "2",
      "audioClipName": "Off",
      "audioVolume": 1,
      "lights": [
        {
          "state": "Off",
          "color": "#fff"
        },
        {
          "state": "Off",
          "color": "#fff"
        },
        {
          "state": "Off",
          "color": "#fff"
        },
        {
          "state": "FadeOff",
          "color": "#fff"
        },
        {
          "state": "FadeOff",
          "color": "#fff"
        },
        {
          "state": "Off",
          "color": "#fff"
        },
        {
          "state": "Off",
          "color": "#fff"
        },
        {
          "state": "Off",
          "color": "#fff"
        }
      ]
    }
  ]
}

... และ หลัง:

{
  "type": "light-item",
  "name": "Waiting",
  "ringSeqLooping": "true",
  "ringSeqHoldLast": "false",
  "ringSteps": [
    {
      "type": "light-step",
      "time": "1",
      "audioClipName": "Off",
      "audioVolume": "1",
      "lights": [
        {"state":"FadeOn","color":"#fff"},
        {"state":"Off","color":"#fff"},
        {"state":"Off","color":"#fff"},
        {"state":"Off","color":"#fff"},
        {"state":"Off","color":"#fff"},
        {"state":"Off","color":"#fff"},
        {"state":"Off","color":"#fff"},
        {"state":"Off","color":"#fff"}
      ]
    },
    {
      "type": "light-step",
      "time": "0.5",
      "audioClipName": "Off",
      "audioVolume": "1",
      "lights": [
        {"state":"FadeOff","color":"#fff"},
        {"state":"Off","color":"#fff"},
        {"state":"Off","color":"#fff"},
        {"state":"Off","color":"#fff"},
        {"state":"Off","color":"#fff"},
        {"state":"Off","color":"#fff"},
        {"state":"Off","color":"#fff"},
        {"state":"Off","color":"#fff"}
      ]
    }
  ],
  "stripSeqLooping": "true",
  "stripSeqHoldLast": "false",
  "stripSteps": [
    {
      "type": "light-step",
      "time": "2",
      "audioClipName": "Off",
      "audioVolume": "1",
      "lights": [
        {"state":"Off","color":"#fff"},
        {"state":"Off","color":"#fff"},
        {"state":"Off","color":"#fff"},
        {"state":"FadeOn","color":"#fff"},
        {"state":"FadeOn","color":"#fff"},
        {"state":"Off","color":"#fff"},
        {"state":"Off","color":"#fff"},
        {"state":"Off","color":"#fff"}
      ]
    },
    {
      "type": "light-step",
      "time": "2",
      "audioClipName": "Off",
      "audioVolume": "1",
      "lights": [
        {"state":"Off","color":"#fff"},
        {"state":"Off","color":"#fff"},
        {"state":"Off","color":"#fff"},
        {"state":"FadeOff","color":"#fff"},
        {"state":"FadeOff","color":"#fff"},
        {"state":"Off","color":"#fff"},
        {"state":"Off","color":"#fff"},
        {"state":"Off","color":"#fff"}
      ]
    }
  ]
}
person bigp    schedule 22.02.2017
comment
ฮึ... ฉันสังเกตเห็นข้อบกพร่องบางอย่างในตอนนี้ (โดยเฉพาะอย่างยิ่งบูลีนและตัวเลข) โดยที่มันใส่เครื่องหมายคำพูดคู่ล้อมรอบ ฉันเดาว่ามันขึ้นอยู่กับคุณที่จะตัดสินใจว่าจะปลอดภัยหรือไม่ที่จะทำการแทนที่ทั่วโลกเพิ่มเติมในสตริง JSON ทั้งหมดเพื่อลบเคส Edge เหล่านั้น - person bigp; 22.02.2017

ลองสิ่งนี้:

JSON.stringify(obj,function(k,v){
   if(v instanceof Array)
      return JSON.stringify(v);
   return v;
},4)
.replace(/"\[/g, '[')
.replace(/\]"/g, ']')
.replace(/\\"/g, '"')
.replace(/""/g, '"');
person Maneesh Sharma    schedule 14.09.2017
comment
ฉันพยายามแล้ว แต่วิธีนี้ใช้ไม่ได้กับวัตถุหลายระดับ - person Chris Glasier; 27.09.2017

นี่คือเวอร์ชันที่เหมาะกับฉัน ฉันต้องการมันสำหรับรายการเดียวหรืออาร์เรย์ตัวเลขเท่านั้น แต่ชุดบูลีนที่เป็นจริงด้านล่างจะทำให้อาร์เรย์ทั้งหมดเป็นบรรทัดเดียว

ดูเหมือนว่าแต่ละเฟรมเวิร์กจะมี gotcha เป็นของตัวเอง! :)

ฉันรู้สึกหงุดหงิดมากจนกระทั่งพบว่า string.replace ใช้งานได้เฉพาะในครั้งแรกเท่านั้น ตอนนี้ฉันมีความสุขที่ได้แก้ไขแล้ว!

โซลูชันอื่น ๆ บางอย่างดูเหมือนจะไม่ทำงานสำหรับฉันบนโหนดใช่ไหม แต่ถ้าวิธีแก้ปัญหาที่ง่ายกว่านั้นได้ผล ฉันจะบอกว่าลงมือทำเลย!

const singleLineForNumericAndSingleItemArray = false;
let formatJsonVtStandard = function(key, value) {
    // Edit: Without checking if it is json, strings holding numbers turn to numbers.
    if (typeof(value) === 'string' && (value.startsWith("{") || value.startsWith("["))) {
        try {
            value = JSON.parse(value);
        } catch (ex) {}
    }
    if (!Array.isArray(value)) {
        return value;
    }
    if (value.length === 0) {
        return value;
    }
    if (singleLineForNumericAndSingleItemArray) {
        // Only keep single items and integer arrays on one line
        if (value.length > 1 && value.some(function(v) { return !Number.isInteger(v); })) {
            return value;
        }
    }
    for (var index in value) {
        if (typeof(value[index]) === 'object') {
            return value; // Don't support arrays that contain objects (little too tricky of a shot)
        } else if (typeof(value[index]) === 'string') { // Keep the double quotes
            value[index] = '#¯\_(ツ)_/¯#"#¯\_(ツ)_/¯#' + value[index] + '#¯\_(ツ)_/¯#"#¯\_(ツ)_/¯#';
        }
    }
    return '#¯\_(ツ)_/¯#[#¯\_(ツ)_/¯#' + value.join('#¯\_(ツ)_/¯#,#¯\_(ツ)_/¯# ') + '#¯\_(ツ)_/¯#]#¯\_(ツ)_/¯#';
};

function prettyStringify(json, extraFormatting = null, spacing = 2) {
    const results = JSON.stringify(json, function(key, value) { let result = formatJsonVtStandard(key, value); if (extraFormatting && extraFormatting !== null) { result = extraFormatting(key, result); } return result; }, spacing);
    const results1 = results.split('\"#¯\_(ツ)_/¯#[#¯\_(ツ)_/¯#').join('[');   // string.replace is sidelined: does not replace all occurrences
    const results2 = results1.split('#¯\_(ツ)_/¯#]#¯\_(ツ)_/¯#\"').join(']');  // string.replace is sidelined: does not replace all occurrences
    const results3 = results2.split('#¯\_(ツ)_/¯#\\"#¯\_(ツ)_/¯#').join('\"'); // string.replace is sidelined: does not replace all occurrences
    const results4 = results3.split('#¯\_(ツ)_/¯#,#¯\_(ツ)_/¯#').join(',');    // string.replace is sidelined: does not replace all occurrences
    return results4;
}

หากต้องการใช้สิ่งนี้ เพียงแทนที่ JSON.stringify ด้วย prettyStringify

person TamusJRoyce    schedule 03.05.2019
comment
แทนที่ #ラ\_(ツ)_/ラ# ด้วย ### หรือ UUID/GUID เพื่อให้โค้ดอ่านง่ายขึ้น - person TamusJRoyce; 04.05.2019

คำตอบสมัยใหม่อีกข้อสำหรับคำถามเก่า: ลองดูที่ FracturedJson ลิงก์นั้นจะนำคุณไปยังเวอร์ชันเว็บ แต่มีให้บริการในรูปแบบแอป commandline และไลบรารีสำหรับ .NET และ JS

FracturedJson จะอินไลน์อาร์เรย์/อ็อบเจ็กต์ตราบใดที่มันไม่ยาวเกินไปหรือซับซ้อนเกินไป นอกจากนี้ยังสามารถแยกอาร์เรย์ออกเป็นหลายบรรทัดโดยมีหลายรายการต่อบรรทัด

ต่อไปนี้คือตัวอย่างการใช้การตั้งค่าเริ่มต้น แต่คุณสามารถปรับการตั้งค่าเหล่านี้ให้เหมาะกับข้อมูลของคุณได้ดีที่สุด

{
    "SimpleItem": 77,
    "ComplexObject": {
        "Subthing1": {"X": 55, "Y": 19, "Z": -4},
        "Subthing2": { "Q": null, "W": [-2, -1, 0, 1] },
        "Distraction": [[], null, null]
    },
    "ShortArray": ["blue", "blue", "orange", "gray"],
    "LongArray": [
        2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 
        79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 
        163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 
        251, 257, 263, 269, 271, 277, 281, 283, 293
    ],
    "LongArray2": [
        [19, 2],
        [3, 8],
        [14, 0],
        [9, 9],
        [9, 9],
        [0, 3],
        [10, 1],
        [9, 1],
        [9, 2],
        [6, 13],
        [18, 5],
        [4, 11],
        [12, 2]
    ]
}

การเปิดเผย: ฉันเป็นผู้เขียน FracturedJson เป็นโอเพ่นซอร์สภายใต้ใบอนุญาต MIT

person j-brooke    schedule 08.11.2020
comment
ฉันคิดว่านี่เป็นทางออกที่ดีที่สุด ขอบคุณ!! - person philo; 14.06.2021

นี่คือวิธีแก้ปัญหาที่ฉันคิดไว้ซึ่งอาจเป็นประโยชน์เป็นพื้นฐานในการทำสิ่งที่คล้ายกัน:

function labTab(ind){
    var tab,com,a;
    tab = "\t";
    com = [];
    for(a = 0; a < ind; a+=1){
        com.push(tab)
    }
    return com.join("");
}

function nsetEntry(tab,o,obj){
    return tab + '"'+ o + '":' + JSON.stringify(obj[o]);
}

function nsetObject(tab,o,obj,arr,ind){
    var start;
    start = tab + '"'+ o + '":{'; 
    return [start,nsetConstructor(obj[o],arr,ind)].join("\n") + "\n" + tab +"}"; 
}

function nsetConstructor(obj,arr,ind){
    var narr,tab,o,entry;
    narr = [];
    ind += 1;
    tab = labTab(ind);
    for(o in obj){
        if(obj[o].constructor === Object){
            entry = nsetObject(tab,o,obj,arr,ind);
            narr.push(entry); 
        }
        else{
            entry = nsetEntry(tab,o,obj);
            narr.push(entry);
        }
    }
    return narr.join(",\n");
}

function nsetLevels(obj,arr,ind){
    var o,start,tab;
    tab = labTab(ind);
    for(o in obj){
        if(obj[o].constructor === Object){
            entry = nsetObject(tab,o,obj,arr,ind);
            arr.push(entry); 
        }
        else{
            entry = nsetEntry(tab,o,obj);   
            arr.push(entry);
        }
    }
        return arr.join(",\n");
}

function nsetSave(){
    var json,o,ind,tab,obj,start,head,tail;
    json = [];
    for(o in nset){
        ind = 1;
        tab = labTab(ind);
        start = tab + '"'+ o + '":{';
        ind = 2;
        tab = labTab(ind);
        obj = nset[o];
        json.push([start,nsetLevels(obj,[],ind)].join("\n"))
    }
    head = "{\n";
    tail = "\n\t}\n}"
    FW.Write([head,json.join("\n\t},\n"),tail].join(""),"xset.json")
}

ฉันไม่สามารถหาวิธีแทนที่ได้ เนื่องจากสมาชิกบางคนลงไปถึงห้าระดับ ดังนั้นฉันจึงสร้างสิ่งทั้งหมดขึ้นมาใหม่ วิธีแก้ปัญหาไม่ได้ร้อนมากนัก แต่ฉันได้สิ่งที่ต้องการบรรลุแล้ว - ตัวอย่างด้านล่าง:

    "Key":{
        "Label":{
            "Change":["Input"],
            "Repeat":{
                "Name":[["Top_level","All"],[[1,1]]],
                "Link":[["Top_level"],[[1,1]]]
            },
            "Delete":["Confirm","Cancel"],
            "Move":["Up","Down"],
            "Number":["Ascending","Descending"]
        },
        "Class":{
            "Change":["Input"]
        },
person Chris Glasier    schedule 10.08.2011

ฉันใช้รูปแบบ JSON สำหรับไฟล์การกำหนดค่าของแอป พวกมันค่อนข้างแตกต่างกันและใหญ่พอ ดังนั้นจึงจำเป็นต้องมีกฎการจัดรูปแบบที่แตกต่างกันเพื่อให้ดูดีขึ้นและอ่านง่าย น่าเสียดายที่คำตอบที่ให้ไว้นั้นไม่ยืดหยุ่นเพียงพอ ฉันจึงได้ดำเนินการใช้งานของตัวเองที่เรียกว่า perfect-json เพื่อทำให้ JSON สวยงาม

พิจารณาว่าคุณต้องการจัดรูปแบบวัตถุในคำถามดังนี้:

{
  "Repeat": {
    "Name": [
      ["Top_level", "All"],
      [[1, 1]]
    ],
    "Link": [
      ["Top_level"],
      [[1, 1]]
    ]
  },
  "Delete": ["Confirm", "Cancel"],
  "Move": ["Up", "Down"],
  "Number": [
    "Ascending",
    "Descending"
  ]
}

ด้วย perfect-json สามารถทำได้:

import perfectJson from 'perfect-json';

const obj = {
  Repeat: {
    Name: [['Top_level', 'All'], [[1, 1]]],
    Link: [['Top_level'], [[1, 1]]]
  },
  Delete: ['Confirm', 'Cancel'],
  Move: ['Up', 'Down'],
  Number: ['Ascending', 'Descending']
};

console.log(perfectJson(obj, {
  singleLine: ({ key, path, depth }) => {
    if (['Delete', 'Move'].includes(key)) {
      return true;
    }
    if (depth >= 3 && ['Name', 'Link'].includes(path[1])) {
      return true;
    }
    return false;
  }
}));

นอกจากนี้ยังง่ายที่จะวางแต่ละอาร์เรย์ไว้ในบรรทัดเดียวตามที่ถามในคำถาม:

console.log(perfectJson(obj, {
  indent: 4,
  singleLine: ({ value }) => Array.isArray(value)
}));
person ezze    schedule 27.07.2021
comment
ทันเวลาครบรอบสิบปีของคำถามนี้ ให้เวลาฉันซึมซับมัน ฉันแน่ใจว่ามันสมควรได้รับการโหวต - person Chris Glasier; 27.07.2021