잘못된 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}}`;
}
{"foo":"e\":bar"}받으십시오 . (유효한 JSON)은 {foo:e:bar"}(...)!
/\\\"/은 /\\"/. 전역 플래그를 추가하는 것을 잊지 마십시오. 그렇지 않으면 /\\"/g여러 \". 임의 문자의 경우 편집기가 질식 할 경우를 대비하여 리터럴 U + FFFF를 사용 하지 말고 이스케이프 시퀀스를 사용하십시오. 되돌리기위한 정규식은 /\uFFFF/g.
이것은 당신이 찾고있는 간단한 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 또는 검사는 서버의 언어에 따라 필요한 것입니다.
.toSource()nodejs 내에서도 잘 작동하지만 배열의 객체는 작동하지 않습니다. 는 util, 멋진 배열의 배열과 객체에 대한 작품을 검사 그것을 사랑 해요.
util.inspect()한 번에 여러 매개 변수를 설정하기 위해 Neo4j 쿼리에 개체를 작성하는 동안 나를 위해 멋지게 작동했습니다.
JSON 형식을 정의한 사람이 만든 파서 의 소스 코드를 볼 수 있습니다 . 함수 호출을 찾습니다 . 값을 따옴표로 묶습니다. 키는 326 및 338 행에 인용되어 있습니다 .json2.js quote
수정 후 라이브러리를 포함하지 마십시오. 대신 관련 ( stringify) 부분 만 취 하거나 적어도 JSON다른 것으로 교체하십시오 . FAKEJSON.
예를 들어, 오브젝트 FAKEJSON만 정의 stringify: http://jsfiddle.net/PYudw/
JSON.stringify부분 만 취하고 따옴표를 제거하십시오. 라이브러리는 JSON을 정의한 사람에 의해 생성되었으므로 결과가 매우 유효한 JSON임을 확신 할 수 있습니다.
.toSource()잘 작동하지만 객체가 어수선한 배열에 있으면 포함하지 않습니다 (그리고 브라우저 호환성이 문제가되지 않는 노드에 있습니다 : P).이 방법을 사용할 것입니다 @RobW 감사합니다. :( 로딩 페이지에 붙어있을 수 있습니다
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(",")
}}`;
};
JSON.stringifyinstanceof Date도 사용해야 합니다. 이 null 인 'null'경우 에도 반환 합니다 obj_from_json.
if(typeof obj_from_json !== "object" || obj_from_json instanceof Date || obj_from_json === null)
JSON5.stringifyJSON5 는 인용되지 않은 속성 키를 포함하여 ES5 구문을 허용하는 JSON의 상위 집합입니다 . JSON5 참조 구현 ( json5npm 패키지 )은 기본 제공 JSON5과 동일한 인수 및 의미를 가진 동일한 메서드를 가진 객체를 제공합니다.JSON 객체 합니다.
사용중인 서비스가이 라이브러리를 사용하고있을 가능성이 높습니다.
CSVJSON의 JSON Beautifier 에는 키에 따옴표를 넣는 옵션이 있습니다. 코드 만 원하는 경우 GitHub 저장소에서 복사 할 수 있습니다. 이에 대한 지원을 추가하기 위해 Douglas Crockford의 JSON2 를 수정 했습니다.
hacked by AnoaGhost