programing

표 형식의 데이터를 JSON으로 어떻게 표현해야 합니까?

lastmemo 2023. 3. 17. 19:33
반응형

표 형식의 데이터를 JSON으로 어떻게 표현해야 합니까?

JDBC에 연결된 Java Servlet에서 JSON을 통해 데이터를 불러오기 위한 API를 작성하고 있습니다.JSON을 선택한 이유는 브라우저의 데이터에 대해 정렬 및 기타 작업을 수행하고 여러 도메인에서 데이터에 액세스하기 때문입니다.

기본적으로 JavaScript에서 SQL 쿼리를 수행하므로 반환되는 데이터는 기본적으로 표 형식입니다.예를 들어 다음과 같이 열 레이블의 목록을 가져오고 값 배열이 돌아오도록 이 글을 쓰기 시작했습니다.

{
  "columns": [
    "given_name",
    "surname",
  ],
  "results": [
    [
      "Joe",
      "Schmoe"
    ],
    [
      "Jane",
      "Doe"
    ]
  ]
}

그러나 반환된 데이터를 처리하기 위해 JavaScript를 작성하기 시작하면서 다음과 같은 키/값 쌍으로 결과를 출력하는 것이 더 나을지 의문입니다.

{
  "results": [
    {
      "given_name": "Joe",
      "surname": "Schmoe"
    },
    {
      "given_name": "Jane",
      "surname" : "Doe"
    }
  ]
}

많은 결과를 반환하는 경우 반복되는 텍스트가 많습니다.하지만 gzip을 전송할 예정이기 때문에 대역폭에 대해서는 크게 염려하지 않습니다.

기본적으로 데이터를 액세스하기 위해 이 기능을 설계해야 합니까?

$.getJSON(query, function(data) {
  var columns = data.columns;
  var results = data.results;
  $.each(results, function(key, row) {
    console.log(row[columns.indexOf('surname')]);
  });
});

아니면 훨씬 더 예쁜

$.getJSON(query, function(data) {
  var results = data.results;
  $.each(results, function(key, row) {
    console.log(row.surname);
  });
});

?

기본적으로 퍼포먼스에 대한 잠재적인 히트가 후자 옵션의 훨씬 더 깨끗한 구문을 정당화하는지 알고 싶습니다.

따르다

나는 그것을 실행하는 방법과 프로파일링 모두 했다.프로파일링 정말 좋은 생각이었어!실적의 차이는 미미했다.데이터 전송 사이즈의 차이는 컸지만, Gzip 압축에서는 양쪽 형식과 매우 큰 데이터 세트와 매우 작은 데이터 세트 간에 차이가 5~6%로 감소했습니다.그래서 저는 더 예쁜 구현으로 하겠습니다.이 어플리케이션에서는 모든 클라이언트가 Gzip/Deflate를 지원하므로 크기는 중요하지 않으며 클라이언트와 서버 모두 계산 복잡도가 비슷하여 문제가 되지 않습니다.

관심 있는 분들을 위해 그래프와 함께데이터를 보내드립니다!

둘 다 프로파일.그 후 최적화.

기타 답변 종합:

  1. 와이어 형식이 메모리 내 형식과 같을 필요는 없습니다.
  2. 어느 쪽이 더 나은 프로파일 - 차이가 있는지 확인합니다.
  3. 처음에는 단순한 것이 좋습니다.

상세:

  • 결과 페이지만 있고 사용자가 적은 경우 두 번째 형식은 첫 번째 형식과 다를 바 없습니다.
  • 데이터가 매우 희박한 경우에는 두 번째 형식이 더 나을 수 있습니다.
  • 1000개 이상의 데이터를 전송하고 수백만 명의 사용자가 있는 경우 전송되는 데이터의 크기가 중요해지고 첫 번째 형식이 도움이 될 수 있습니다.
  • 모든 사용자 에이전트가 gzip/deflate를 지원한다고 보장할 수는 없으므로 유의하십시오.

또 하나의 JSON 구조에서 매우 좋은 결과를 얻었습니다.

{
    "recordCount": 2,
    "data": {
        "Id": [1, 2],
        "Title": ["First record", "Second record"],
        "Value": [18192, 18176]
    }
}

모든 데이터 통과:

for (var i = 0; i < recordSet.recordCount; ++i) {
    console.log("Record " + i.toString() + ":");
    for (var field in recordSet.data)
        console.log("\t" + field + ": " + recordSet.data[field][i].toString());
}

코드를 보다 콤팩트하고 번거로운 포맷으로 묶을 필요가 없습니다.에 JS가 합니다.columns만약 그것이 없다면, 당신은 단순한 배열의 물체를 다루고 있는 것입니다.있으면 번거로운 포맷을 보다 편리한 포맷으로 쉽게 매핑할 수 있습니다.

WWIW 저는 두 번째 옵션으로 하겠습니다.여러분이 관찰한 바와 같이 더 깨끗한 JavaScript에 적합하며, 또한 인간이 읽고 이해하는 것도 더 쉬워집니다.옵션 1에서 얻을 수 있는 작은 성능보다 가독성이 우선합니다.

또한 언젠가 열을 추가하거나 열의 순서를 바꾸게 되면 첫 번째 옵션을 사용하면 응답 데이터의 위치에 따라 작업하기 때문에 JavaScript를 많이 다시 작성해야 할 것입니다.

첫 번째 옵션을 언제든지 JSON 표현으로 변환할 수 있습니다.

const tabularDataToJSON = (rows: string[][], columns: { value: string }[]) => {
return rows.map(function (row) {
    const record: Record<string, string> = {}
    columns.forEach((col, index) => {
        record[col.value] = row[index]
    })
    return record
})}


const json = tabularDataToJSON(results, columns)

언급URL : https://stackoverflow.com/questions/5863304/how-should-i-represent-tabular-data-in-json

반응형