[javascript] 속성에 따옴표없이 JSON.stringify?

잘못된 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}}`;
}

예 : https://jsfiddle.net/DerekL/mssybp3k/


답변

이것은 당신이 찾고있는 간단한 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 형식을 정의한 사람이 만든 파서 의 소스 코드를 볼 수 있습니다 . 함수 호출을 찾습니다 . 값을 따옴표로 묶습니다. 키는 326338 행에 인용되어 있습니다 .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(",")
            }}`;
};