programing

JSON을 덜 장황하게 하려면 어떻게 해야 합니까?

yellowcard 2023. 9. 27. 17:43
반응형

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

반응형