속성에 따옴표없이 JSON.stringify?
잘못된 JSON 형식 (속성 주위에 큰 따옴표 없음)을 사용하는 서비스를 사용하고 있습니다. 그래서 보내야합니다
{ name: "John Smith" }
대신에 { "name": "John Smith" }
이 형식은 내 서비스가 아니므로 변경할 수 없습니다.
누구든지 위와 같이 JavaScript 객체를 형식화하는 stringify 라우팅을 알고 있습니까?
var json = '{ "name": "John Smith" }'; //Let's say you got this
json = json.replace(/\"([^(\")"]+)\":/g,"$1:"); //This will remove all the quotes
json; //'{ 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}}`;
}
예 : https://jsfiddle.net/DerekL/mssybp3k/
코드는 ES6로 작성되었으며 이전 브라우저의 경우 트랜스 파일 또는 수동 번역이 필요할 수 있습니다.
이것은 당신이 찾고있는 간단한 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/
이 작업을 수행 할 좋은 NPM 패키지를 찾았습니다.
https://www.npmjs.com/package/stringify-object
const stringify = require('stringify-object')
let prettyOutput = stringify(json);
꽤 잘 작동합니다.
JSONP와 함께 servive를 사용하십시오.이 형식을 사용할 때 제공하는 것 같습니다.
그렇지 않으면 왜이 표준을 준수해야하는지에 대한 좋은 주장을 포함하여 자세한 버그 보고서를 제출하십시오. 소스 문제를 제거하는 것 이외의 다른 해결책은 실제 해결책이 아닙니다.
빠르고 더러운 수정은 구문 분석하기 전에 정규식을 통해 문자열을 파이프하는 것입니다.
var obj = JSON.parse(str.replace(/(\{|,)\s*(.+?)\s*:/g, '$1 "$2":'));
또는 좀 더 구문 분석을 원하면 기존 자바 스크립트 JSON 파서 (예 : 이와 같은 ) 를 조정하려고합니다 .
상속 된 구문은 JSON의 상위 집합 인 YAML에서 쉽게 먹을 수 있어야합니다.
JavaScript YAML 파서 및 덤퍼를 사용해보십시오 : http://nodeca.github.com/js-yaml/
CSVJSON의 JSON Beautifier 에는 키에 따옴표를 넣는 옵션이 있습니다. 코드 만 원하는 경우 GitHub 저장소에서 복사 할 수 있습니다. 이에 대한 지원을 추가하기 위해 Douglas Crockford의 JSON2 를 수정 했습니다.
@Derek朕會功夫 Thanks for sharing this method, I'de like to share my code which supports stringifying an array of objects as well.
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(",")
}}`;
};
참고URL : https://stackoverflow.com/questions/11233498/json-stringify-without-quotes-on-properties
'Programing' 카테고리의 다른 글
Node.js "필수"함수 및 매개 변수 (0) | 2020.11.05 |
---|---|
프로세스 이름으로 필터링하고 CPU 사용량을 기록합니다. (0) | 2020.11.05 |
Jekyll에서 if 문을 어떻게 연결합니까? (0) | 2020.11.05 |
Java에서 프로그래밍 방식으로 인터페이스의 모든 구현 목록을 얻으려면 어떻게해야합니까? (0) | 2020.11.05 |
목록 변환 (0) | 2020.11.05 |