속성에 따옴표 없이 JSON.stringify를 지정하시겠습니까?
잘못된 JSON 형식(속성 주위에 큰따옴표 없음)을 사용하는 서비스를 사용하고 있습니다.그래서 나는 보낼 필요가 있다.
{ name: "John Smith" }
{ "name": "John Smith" }
이 형식은 내 서비스가 아니기 때문에 변경할 수 없습니다.
위와 같이 JavaScript 객체를 포맷하기 위한 stringify routing에 대해 아는 사람이 있습니까?
이 간단한 정규 표현 솔루션은 대부분의 경우 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" }'
고쳐준 롭 W에게 특별한 감사를 표합니다.
한계
통상적인 경우 위의 regexp는 동작하지만 수학적으로는 JSON 형식을 정규식으로 기술할 수 없기 때문에 모든 경우에 사용할 수 있습니다(regexp에서는 같은 수의 곱슬 괄호를 셀 수 없습니다).따라서 네이티브 함수를 통해 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 to String 메서드인 것 같습니다.
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
서버 언어에 따라 필요한 문자열 또는 검사는 오브젝트입니다.
TL;DR -- 코드
브라우저에서의 lookbehind 지원에 대해서는 다음과 같이 주의해 주십시오.
function cleanIt(obj) {
var cleaned = JSON.stringify(obj, null, 2);
return cleaned.replace(/^[\t ]*"[^:\n\r]+(?<!\\)":/gm, function (match) {
return match.replace(/"/g, "");
});
}
메모: 2021년 6월 18일 현재 IE 또는 이상하게도 Safari 버전은 지원되지 않습니다.그것을 사용하려면 , 삭제해 주세요.
(?<!\\)
got cha ( got cha ) ( got cha ( got cha ( gotcha ) 。
이 문자열은 예쁘고, 정규식을 사용하여 키를 찾은 다음, "모든 큰따옴표가 제거된 일치 항목이 있습니다."라고 하는 리페이서 기능을 통해 각 키 일치가 교체됩니다.놈들의 콜론에만 열쇠를 맞추었으니까 그게 바로 우리가 원하는 거야
자세한 내용은 다음과 같습니다.
왜 인정된 답변이 옳지 않은가?
안타깝게도 Adel이 지적한 것처럼 Derek의 정규 표현 없는 솔루션에는 상당히 심각한 문제가 있습니다.오브젝트 배열은 처리하지 않습니다.이게 어떻게 끝나는지 보고 "배열이라면JSON.stringify
떻게게 대처 ?? ???단순한 값 유형에는 해당되지만 개체에는 해당되지 않습니다.
// \/\/\/ OH NOES!!! \/\/\/
if (typeof obj_from_json !== "object" || Array.isArray(obj_from_json)){
// not an object, stringify using native function
return JSON.stringify(obj_from_json);
// ^^^^^^^^^^^^^^ No! Don't do that!
}
나는 실패 사례로 그의 바이올린을 편집했다.payload는 다음과 같습니다.
var obj = {
name: "John Smith",
favoriteObjects: [
{ b: "there's", c: "always", d: "something" },
[1, 2, "spam", { f: "hello" }],
{ vowels: "are missing" },
],
favoriteFruits: ["Apple", "Banana"],
};
다음은 백지화 출력입니다.
{
name:"John Smith",
favoriteObjects:[
{
"b":"there's", <<< Major
"c":"always", <<< fails
"d":"something" <<< here
},
[
1,2,"spam",
{
"f":"hello" <<< and here.
}
],
{
"vowels":"are missing" <<< again.
}
],
favoriteFruits:["Apple","Banana"] <<< that worked!
}
(?)이 있는데favoriteFruits
예: )의.어레이 내의 오브젝트(예:favoriteObjects
량입니니다다
심플한 솔루션
문제의 복잡성을 크게 줄일 수 있는 교묘한 방법을 찾기 전에 이 기능을 정리하는 데 너무 많은 시간을 할애했습니다.그 때문에 regex가 다시 혼재하고 있다고 생각합니다.
로 stringify
맥과이어 씨의 입장에서, 저는 당신에게 딱 한 마디만 하고 싶습니다.
공백.
로 JSON.stringify
공백이 좀 있어요.그러면 키에서 따옴표를 삭제하는 정규식이 훨씬 쉬워집니다.
다음과 같이 솔루션을 시작합니다.
var cleaned = JSON.stringify(x, null, 2);
에 대한 호출이 "stringify"로 표시됩니다.x
번째 파라미터는 화려한 함수1'의 두 를 사용하지 않습니다.null
의 ( 파라미터는 2개의 (3번째 파라미터는 2개)입니다.2
) 。 ★★★2
또한 각 부동산에 대해 별도의 라인을 구입합니다.
{
"name": "John Smith",
"favoriteObjects": [
{
"b": "there's",
"c": "always",
// etc...
이제 모든 키가 줄의 첫머리에 있습니다.우리가 감당할 수 있어
이제 키에서 따옴표를 지웁니다.
키만 , 만 찾고, 키 주변은 다 보겠습니다"
키가 모두 전용선상에 있는 것을 알 수 있기 때문에, 보다 심플하게 할 수 있습니다.
유일한 진짜 gotcha는 속성에 대한 값이 다음을 포함하는 경우입니다.":
은 일을 수 .그건 일을 망칠 수 있어.
"a": [
"This could \": be bad",
"QQ"
]
뒷모습 경고문
저는 오래된 브라우저에 대한 화려한 부정적인 예측으로 이 문제를 해결하고 싶었지만 포기하고 부정적인 이면을 사용했습니다.부정적인 룩백은 2018년 이후 브라우저 서브셋에서만 지원됩니다(2ality에서 룩백 제안 이력에 대한 설명, 브라우저 호환성은 여기에서 확인할 수 있습니다.
RegEx 설명:
/^[\t ]*"[^:\n\r]+(?<!\\)":/gm
그 정규식은...
- 규식입입니니다
- 「」로 합니다.
/
- 「」로 합니다.
- (0 ~ 무한 스페이스 또는 탭)으로 시작하는 행을 찾습니다.
^[\t ]*
- a는 a.
"
"
- 그러면 다른 문자 중 하나 또는 여러 개의 문자가 됩니다.
:
또는 줄바꿈 문자[^:\n\r]+
- 두 .
":
(부정적인 뒷면 경고)에는 백슬래시가 선행되지 않습니다.(?<!\\)":
- JavaScript의 이면에 대한 자세한 내용은 여기를 참조하십시오.
- 글로벌하게 복수회선(회선별)을 이용할 수 있습니까?
/gm
합리적인 성공을 만지작거리다.
결과:
{
name: "John Smith",
favoriteObjects: [
{
b: "there's",
c: "always",
d: "something"
},
[
1,
2,
"spam",
{
f: "hello"
}
],
{
vowels: "are missing"
}
],
favoriteFruits: [
"Apple",
"Banana"
]
}
QED는 JADENT가 물어본지 8년 반이 지났습니다.이제 서비스다!
빠른 업데이트:코드로 이 문제를 해결할 필요가 없다면(사용 예에 따라서는 이 라이브러리에 직접 전화할 수도 있음) 더 예쁜 것을 사용하여 물건을 깨끗하게 청소하는 것이 좋습니다.
JSON5.stringify
JSON5는 따옴표가 없는 속성 키를 포함하여 ES5 구문을 사용할 수 있는 JSON의 슈퍼셋입니다.JSON5 레퍼런스 구현(json5
npm 패키지)은JSON5
된 arg와 및JSON
★★★★★★ 。
사용하고 있는 서비스가 이 라이브러리를 사용하고 있을 가능성이 높습니다.실제로 JSON5는 다음과 같은 많은 고급 프로젝트에서 사용됩니다.
JSON5는 2012년에 시작되어 2022년 현재 주당 6500만 다운로드를 넘어 npm에 가장 의존도가 높은 패키지의 상위 0.1%에 랭크되었으며, Chromium, Next.js, Babel, Retool, WebStorm 등 주요 프로젝트에 채택되었습니다.또한 MacOS 및 iOS와 같은 Apple 플랫폼에서도 기본적으로 지원됩니다.
~ json5.org 홈페이지
의 소스 코드를 참조할 수 있습니다.quote
function calls: 값을 따옴표로 묶습니다.키는 326행과 338행에 인용되어 있습니다.
수정 후에는 라이브러리를 포함하지 마십시오. 해당.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를 사용해 보세요.이 포맷을 사용할 때 제공되는 것 같습니다.
또는 가 표준에 준거할 필요가 있는 이유에 대한 적절한 논거를 포함한 자세한 버그보고서를 제출합니다.근원적인 문제를 해소하는 것 외에 다른 해결책은 없습니다.
빠른 더티 수정은 문자열을 구문 분석하기 전에 regex를 통해 파이핑하는 것입니다.
var obj = JSON.parse(str.replace(/(\{|,)\s*(.+?)\s*:/g, '$1 "$2":'));
더 구문적인 해석을 원할 경우 기존 javascript 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(",")
}}`;
};
CSVJSON의 JSON Beautifier에는 키에 따옴표를 붙이는 옵션이 있습니다.코드만 원하시면 GitHub repo에서 복사할 수 있습니다.더글라스 크록포드의 JSON2를 수정하여 지원했습니다.
JSON을 JavaScript 코드 내에서 직접 사용할 수 있도록 내보내려면 다음 솔루션이 필요합니다.이 솔루션은 모든 JavaScript 변수에 대해 작동하며 개체/어레이를 포함하는 개체/어레이와 함께 작동합니다.
아래 함수의 가장 좋은 사용 사례는 불필요한 따옴표를 사용하지 않고 JavaScript에 포함시키고 싶은 JSON을 사용하는 경우입니다.이렇게 하면 특히 "x"나 "y"와 같은 단축 키가 있는 경우 데이터를 많이 절약할 수 있습니다.
function toUnquotedJSON(param){ // Implemented by Frostbolt Games 2022
if(Array.isArray(param)){ // In case of an array, recursively call our function on each element.
let results = [];
for(let elem of param){
results.push(toUnquotedJSON(elem));
}
return "[" + results.join(",") + "]";
}
else if(typeof param === "object"){ // In case of an object, loop over its keys and only add quotes around keys that aren't valid JavaScript variable names. Recursively call our function on each value.
let props = Object
.keys(param)
.map(function(key){
// A valid JavaScript variable name starts with a dollar sign (?), underscore (_) or letter (a-zA-Z), followed by zero or more dollar signs, underscores or alphanumeric (a-zA-Z\d) characters.
if(key.match(/^[a-zA-Z_$][a-zA-Z\d_$]*$/) === null) // If the key isn't a valid JavaScript variable name, we need to add quotes.
return `"${key}":${toUnquotedJSON(param[key])}`;
else
return `${key}:${toUnquotedJSON(param[key])}`;
})
.join(",");
return `{${props}}`;
}
else{ // For every other value, simply use the native JSON.stringify() function.
return JSON.stringify(param);
}
}
솔루션에서는 함수 컨스트럭터를 사용하여 문자열을 JSON으로 해석한 후 문자열화하는 임시 함수를 만듭니다.
function stringify2(notQuiteJsonString) {
var tempFunc = new Function(`return JSON.stringify(${notQuiteJsonString})`)
return tempFunc()
}
var jObj = `{a: 123, b: "This is b", c: {d: 10, c: "More stuff"}}`;
console.log(stringify2(jObj));
// {"a":123,"b":"This is b","c":{"d":10,"c":"More stuff"}}
bash/shell 명령 및 nodejs 명령으로 시도했지만 정상적으로 동작하고 있는 것 같습니다.
node <<END
> aaa = {
> "abc": "xyz",
> "num1": 1,
> "text1": "my text",
> "final": "the \"final\" text"
> }
> console.log(aaa)
> END
{ abc: 'xyz', num1: 1, text1: 'my text', final: 'the "final" text' }
이라면 mysql을 사용할 수 .CAST(JSON_UNQUOTE(?) AS JSON))
처럼 단순한
.replace(/[\[\]']+/g, '')
다음으로 대체됩니다.
[]
것도 없이
또는
.replace(/[\{\}']+/g, '').
다음으로 대체됩니다.
{}
것도 없이
언급URL : https://stackoverflow.com/questions/11233498/json-stringify-without-quotes-on-properties
'programing' 카테고리의 다른 글
Oracle 11g에서 테이블스페이스 간에 테이블을 이동하는 방법 (0) | 2023.03.23 |
---|---|
Wordpress permalink '이 서버에서 찾을 수 없습니다' (0) | 2023.03.23 |
미디어 파일 워드프레스를 모두 받을 수 있는 기능은 무엇입니까? (0) | 2023.03.23 |
보기에서 응용프로그램/json MIME 유형 강제 적용(플래스크) (0) | 2023.03.23 |
jQuery JSON 응답은 항상 ParseError를 트리거합니다. (0) | 2023.03.23 |