잘못된 JSON 형식 (속성 주위에 큰 따옴표 없음)을 사용하는 서비스를 사용하고 있습니다. 그래서 보내야합니다
{ name: "John Smith" }
대신에 { "name": "John Smith" }
이 형식은 내 서비스가 아니므로 변경할 수 없습니다.
누구든지 위와 같은 JavaScript 객체의 형식을 지정하는 stringify 라우팅을 알고 있습니까?
답변
이 간단한 정규식 솔루션은 대부분의 경우 JSON 속성 이름을 인용 해제합니다.
const object = { name: 'John Smith' };
const json = JSON.stringify(object); // {"name":"John Smith"}
console.log(json);
const unquoted = json.replace(/"([^"]+)":/g, '$1:');
console.log(unquoted); // {name:"John Smith"}
극단적 인 경우 :
var json = '{ "name": "J\\":ohn Smith" }'
json.replace(/\\"/g,"\uFFFF"); // U+ FFFF
json = json.replace(/"([^"]+)":/g, '$1:').replace(/\uFFFF/g, '\\\"');
// '{ name: "J\":ohn Smith" }'
문제를 해결해 주신 Rob W에게 특별히 감사드립니다.
한계
일반적인 경우에는 앞서 언급 한 정규 표현식이 작동하지만 수학적으로는 정규 표현식을 사용하여 JSON 형식을 설명하는 것이 불가능하므로 모든 경우에서 작동합니다 (정규 표현식에서는 동일한 수의 중괄호를 계산할 수 없습니다.). 네이티브 함수를 통해 JSON 문자열을 공식적으로 구문 분석하고 다시 직렬화하여 따옴표를 제거하는 새 함수를 만듭니다.
function stringify(obj_from_json) {
if (typeof obj_from_json !== "object" || Array.isArray(obj_from_json)){
// not an object, stringify using native function
return JSON.stringify(obj_from_json);
}
// Implements recursive object serialization according to JSON spec
// but without quotes around the keys.
let props = Object
.keys(obj_from_json)
.map(key => `${key}:${stringify(obj_from_json[key])}`)
.join(",");
return `{${props}}`;
}
답변
이것은 당신이 찾고있는 간단한 Object toString 메소드 인 것 같습니다.
Node.js에서 이것은 util 객체를 사용하고 util.inspect (yourObject)를 호출하여 해결됩니다. 이것은 당신이 원하는 모든 것을 줄 것입니다. 방법 적용의 깊이를 포함하여 더 많은 옵션을 보려면이 링크를 따르십시오.http://nodejs.org/api/util.html#util_util_inspect_object_options
그래서, 당신이 찾고있는 것은 기본적으로 JSON 변환기가 아닌 객체 검사기입니다. JSON 형식은 모든 속성을 큰 따옴표로 묶어야 함을 지정합니다. 따라서 단순히 JSON 형식이 아니므로 원하는 작업을 수행하는 JSON 변환기가 없습니다.
https://developer.mozilla.org/en-US/docs/Using_native_JSON
Object to string 또는 검사는 서버의 언어에 따라 필요한 것입니다.
답변
JSON 형식을 정의한 사람이 만든 파서 의 소스 코드를 볼 수 있습니다 . 함수 호출을 찾습니다 . 값을 따옴표로 묶습니다. 키는 326 및 338 행에 인용되어 있습니다 .json2.js
quote
수정 후 라이브러리를 포함하지 마십시오. 대신 관련 ( stringify
) 부분 만 취 하거나 적어도 JSON
다른 것으로 교체하십시오 . FAKEJSON
.
예를 들어, 오브젝트 FAKEJSON
만 정의 stringify
: http://jsfiddle.net/PYudw/
답변
JSONP와 함께 servive를 사용하십시오.이 형식을 사용할 때 제공한다고 생각합니다.
그렇지 않으면 왜이 표준을 준수해야하는지에 대한 좋은 주장을 포함하여 자세한 버그 보고서를 제출하십시오. 소스 문제를 제거하는 것 이외의 다른 해결책은 실제 해결책이 아닙니다.
빠르고 더러운 수정은 구문 분석하기 전에 정규식을 통해 문자열을 파이프하는 것입니다.
var obj = JSON.parse(str.replace(/(\{|,)\s*(.+?)\s*:/g, '$1 "$2":'));
또는 보다 구문적인 구문 분석을 원하면 기존 javascript JSON 구문 분석기 (예 : 이와 같은 ) 를 조정하려고합니다 .
답변
이 작업을 수행 할 좋은 NPM 패키지를 찾았습니다.
https://www.npmjs.com/package/stringify-object
const stringify = require('stringify-object')
let prettyOutput = stringify(json);
꽤 잘 작동합니다.
답변
상속 된 구문은 JSON의 상위 집합 인 YAML에서 쉽게 먹을 수 있어야합니다.
JavaScript YAML 파서 및 덤퍼를 사용해보십시오 : http://nodeca.github.com/js-yaml/
답변
@Derek 朕 會 功夫이 방법을 공유 해주셔서 감사합니다. 객체 배열의 문자열 화를 지원하는 코드도 공유하고 싶습니다.
export const stringifyObjectWithNoQuotesOnKeys = (obj_from_json) => {
// In case of an array we'll stringify all objects.
if (Array.isArray(obj_from_json)) {
return `[${
obj_from_json
.map(obj => `${stringifyObjectWithNoQuotesOnKeys(obj)}`)
.join(",")
}]` ;
}
// not an object, stringify using native function
if(typeof obj_from_json !== "object" || obj_from_json instanceof Date || obj_from_json === null){
return JSON.stringify(obj_from_json);
}
// Implements recursive object serialization according to JSON spec
// but without quotes around the keys.
return `{${
Object
.keys(obj_from_json)
.map(key => `${key}:${stringifyObjectWithNoQuotesOnKeys(obj_from_json[key])}`)
.join(",")
}}`;
};