JSON을 덜 장황하게 하려면 어떻게 해야 합니까?
저는 현재 웹 어플리케이션을 개발하고 있으며 jax 요청 및 응답을 위해 JSON을 사용하고 있습니다.매우 큰 데이터 세트를 10000개 이상의 객체 배열 형태로 클라이언트에 반환하는 영역이 있습니다.예의 일부는 다음과 같습니다(이는 다소 단순화되었습니다).
"schedules": [
{
"codePractice": 35,
"codeScheduleObject": 576,
"codeScheduleObjectType": "",
"defaultCodeScheduleObject": 12,
"name": "Dr. 1"
},
{
"codePractice": 35,
"codeScheduleObject": 169,
"codeScheduleObjectType": "",
"defaultCodeScheduleObject": 43,
"name": "Dr. 2"
},
{
"codePractice": 35,
"codeScheduleObject": 959,
"codeScheduleObjectType": "",
"defaultCodeScheduleObject": 76,
"name": "Dr. 3"
}
]
이 배열에 매우 많은 개체가 있는 경우 JSON 응답의 크기가 상당히 클 수 있음을 상상할 수 있습니다.
제 질문은 JSON 문자열화기/파서를 변환할 수 있는"schedules"
JSON 문자열로 이와 같은 모양으로 배열:
"schedules": [
["codePractice", "codeScheduleObject", "codeLogin", "codeScheduleObjectType", "defaultCodeScheduleObject","name"],
[35, 576, "", 12, "Dr. 1"],
[35, 169, "", 43, "Dr. 2"],
[35, 959, "", 76, "Dr. 3"],
]
즉, 그 시작에 배열이 있을 것이라는 것."schedules"
이 배열과 다른 모든 컨테이너 배열의 값을 저장하는 개체의 키를 저장하는 배열입니다.
제가 원한다면 서버에서 변환을 하고 클라이언트에서 파싱을 할 수 있는데 큰 JSON을 파싱/스트링하는 표준 라이브러리가 있는지 궁금합니다.
미니머를 통해 실행할 수도 있지만, 애플리케이션 내에서 일부 컨텍스트를 제공하기 때문에 현재 보유하고 있는 키를 유지하고 싶습니다.
여기서 제 접근법을 비판해주시거나 대안을 제시해 주셨으면 합니다.
HTTP 압축(즉, gzip 또는 deblate)은 이미 정확히 이 작업을 수행합니다.JSON 키와 같이 반복되는 패턴은 토큰으로 대체되어 전송당 한 번만 장황한 패턴이 발생하기만 하면 됩니다.
답변이 아니라, 1만 건의 항목과 일부 허위 데이터를 바탕으로 대략적인 "저축"을 추정하는 것 :-) 제가 올린 댓글에 대한 답변입니다.복잡성이 더해지면 스키마화된 접근 방식이 가치가 있을까요?
"상황에 따라 다릅니다."
이 C#은 LINQPad이며 테스트/수정을 위해 준비되어 있습니다.
string LongTemplate (int n1, int n2, int n3, string name) {
return string.Format(@"
{{
""codePractice"": {0},
""codeScheduleObject"": {1},
""codeScheduleObjectType"": """",
""defaultCodeScheduleObject"": {2},
""name"": ""Dr. {3}""
}}," + "\n", n1, n2, n3, name);
}
string ShortTemplate (int n1, int n2, int n3, string name) {
return string.Format("[{0}, {1}, \"\", {2}, \"Dr. {3}\"],\n",
n1, n2, n3, name);
}
string MinTemplate (int n1, int n2, int n3, string name) {
return string.Format("[{0},{1},\"\",{2},\"Dr. {3}\"],",
n1, n2, n3, name);
}
long GZippedSize (string s) {
var ms = new MemoryStream();
using (var gzip = new System.IO.Compression.GZipStream(ms, System.IO.Compression.CompressionMode.Compress, true))
using (var sw = new StreamWriter(gzip)) {
sw.Write(s);
}
return ms.Position;
}
void Main()
{
var r = new Random();
var l = new StringBuilder();
var s = new StringBuilder();
var m = new StringBuilder();
for (int i = 0; i < 10000; i++) {
var n1 = r.Next(10000);
var n2 = r.Next(10000);
var n3 = r.Next(10000);
var name = "bogus" + r.Next(50);
l.Append(LongTemplate(n1, n2, n3, name));
s.Append(ShortTemplate(n1, n2, n3, name));
m.Append(MinTemplate(n1, n2, n3, name));
}
var lc = GZippedSize(l.ToString());
var sc = GZippedSize(s.ToString());
var mc = GZippedSize(s.ToString());
Console.WriteLine(string.Format("Long:\tNormal={0}\tGZip={1}\tCompressed={2:P}", l.Length, lc, (float)lc / l.Length));
Console.WriteLine(string.Format("Short:\tNormal={0}\tGZip={1}\tCompressed={2:P}", s.Length, sc, (float)sc / s.Length));
Console.WriteLine(string.Format("Min:\tNormal={0}\tGZip={1}\tCompressed={2:P}", m.Length, mc, (float)mc / m.Length));
Console.WriteLine(string.Format("Short/Long\tRegular={0:P}\tGZip={1:P}",
(float)s.Length / l.Length, (float)sc / lc));
Console.WriteLine(string.Format("Min/Long\tRegular={0:P}\tGZip={1:P}",
(float)m.Length / l.Length, (float)mc / lc));
}
내 결과:
길이: 일반=1754614 GZip=197053 압축=11.23%단축: 정상=384614 GZip=128252 압축=33.35%최소: 정상=334614 GZip=128252 압축=38.33%짧고 긴 정규 =21.92% GZip =65.09%최소/긴정규=19.07%GZip=65.09%
결론:
- 가장 큰 절감 효과는 GZIP을 사용하는 것입니다(단순히 스키마'ize를 사용하는 것보다 낫습니다).
- GZIP + 스키마'가 전체적으로 가장 작습니다.
- GZIP에서는 일반적인 자바스크립트 미니마이저(JavaScript Minimizer)를 사용할 필요가 없습니다.
- GZIP(예: DEFLATE)을 사용합니다. 반복 구조화된 텍스트(일반적인 경우 900% 압축!)에서 매우 우수합니다.
해피 코딩.
다음은 여러분이 원하는 작업을 거의 수행하는 기사입니다.
http://stevehanov.ca/blog/index.php?id=104
언뜻 보면 알고리즘의 첫 번째 단계 이후에 예제가 다음 단계로 압축되어 이후 단계에서 실제로 더 많은 작업을 수행할 것으로 보입니다.)
{
"templates": [
["codePractice", "codeScheduleObject", "codeScheduleObjectType", "defaultCodeScheduleObject", "name"]
],
"values": [
{ "type": 1, "values": [ 35, 576, "", 12, "Dr. 1" ] },
{ "type": 1, "values": [ 35, 169, "", 43, "Dr. 2" ] },
{ "type": 1, "values": [ 35, 959, "", 76, "Dr. 3" ] }
]
}
알고리즘의 장점을 이미 확인할 수 있습니다.컴프레서를 통해 실행한 후 최종 출력은 다음과 같습니다.
{
"f" : "cjson",
"t" : [
[0,"schedules"],
[0,"codePractice","codeScheduleObject","codeScheduleObjectType","defaultCodeScheduleObject","name"]
],
"v" : {
"" : [ 1, [
{ "" : [2, 35, 576, "", 12, "Dr. 1"] },
{ "" : [2, 35, 169, "", 43, "Dr. 2"] },
{ "" : [2, 35, 959, "", 76, "Dr. 3"] }
]
]
}
}
몇 천 개의 기록을 가지고 있다면 분명히 향상을 볼 수 있습니다.출력물은 여전히 읽을 수 있지만 다른 사람들도 옳다고 생각합니다. 좋은 압축 알고리즘은 어쨌든 반복되는 텍스트 블록을 제거할 것입니다.
JSON 스키마를 변경하기 전에 먼저 시도해 보십시오.
http://httpd.apache.org/docs/2.0/mod/mod_deflate.html
참고로 저는 정확히 php로 하고 있습니다.데이터베이스의 개체 목록입니다.
$comp=base64_encode(gzcompress(json_encode($json)));
json : 스트링 (22501 길이)
gz 압축 = 문자열(711)이지만 이진 형식입니다.
gz 압축 + base64 = 문자열(948)은 텍스트 형식입니다.
따라서 초 단위를 사용함으로써 훨씬 더 작습니다.
언급URL : https://stackoverflow.com/questions/6131059/how-do-i-make-my-json-less-verbose
'programing' 카테고리의 다른 글
연락처 양식 7로 게시물 제목을 받는 방법 (0) | 2023.10.02 |
---|---|
redis 데이터베이스 비우는 방법? (0) | 2023.10.02 |
오래된 Oracle Connection Class를 사용하지 않고 Oracle Connection을 설정하는 방법 (0) | 2023.09.27 |
셸 / Perl 스크립트에서 암호를 유지하는 모범 사례는 무엇입니까? (0) | 2023.09.27 |
'packages' 요소가 선언되지 않았습니다. (0) | 2023.09.27 |