Json - строчить так, чтобы массивы находились на одной линии
Можно ли воссоздать объект JSON, чтобы он выглядел так: массивы в одной строке - без отступов
{
"Repeat": {
"Name": [["Top_level","All"],[[1,1]]],
"Link": [["Top_level"],[[1,1]]]
},
"Delete": ["Confirm","Cancel"],
"Move": ["Up","Down"],
"Number": ["Ascending","Descending"]
}
Ответы
Ответ 1
Попробуйте следующее:
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);
Ответ 2
Если вы хотите отображать короткие массивы в виде одиночных строк, рассмотрите возможность использования json-stringify-pretty-compact. Он дает результаты, выглядящие следующим образом:
{
"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}
]
}
Ответ 3
Взяв ответы от ericbowden и bigp, я создал следующую функцию, которая позволяет мне печатать 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;
}
Ответ 4
Другой подход, который я принял:
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))
* Массив не должен содержать строки (обратите внимание на "в не содержится внутри регулярного выражения" ), если вы его удалите, он будет ловить ключ, значения:
"[": "[1,2,3,4]",
Ответ 5
Вот версия, которая работает для меня. Мне это нужно только для отдельных элементов или числовых массивов. Но приведенное ниже логическое значение true превращает все массивы в один лайнер.
Кажется, что каждая структура имеет свои собственные ошибки! :)
Я был очень расстроен, пока не узнал, что 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
Ответ 6
Вот решение, которое я разработал, который может быть полезен в качестве основы для выполнения чего-то подобного:
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"]
},
Ответ 7
Помните, что это использует 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"}
]
}
]
}
Ответ 8
Попробуйте следующее:
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, '"');