programing

중첩된 JSON 생성

javajsp 2023. 7. 18. 21:32

중첩된 JSON 생성

단순한 JSON에서 중첩된 JSON을 생성하려고 합니다.하지만 해결책을 찾을 수 있습니다.

다음은 제가 변환하려는 JSON입니다.

[
  {
    "station_id": "ESP0001",
    "datetime": "2022-11-25T06:43:06.000Z",
    "dimension": "temperature",
    "value": 15.33,
    "representation": "°C",
    "unit": "Celsius",
    "unit_id": 1
  },
  {
    "station_id": "ESP0001",
    "datetime": "2022-11-25T06:43:06.000Z",
    "dimension": "humidity",
    "value": 92,
    "representation": "%",
    "unit": "Percentage",
    "unit_id": 4
  },
  {
    "station_id": "ESP0001",
    "datetime": "2022-11-25T06:43:06.000Z",
    "dimension": "pressure",
    "value": 1016,
    "representation": "hPa",
    "unit": "HectoPascal",
    "unit_id": 5
  }
]

데이터는 이 sql 쿼리(MariaDB 10.8)에 의해 제공됩니다.

SELECT  
    r.station_id, 
    r.datetime,
    ud.dimension,
    r.value,
    u.representation,
    u.unit,
    r.unit_id
FROM readings r 
INNER JOIN units u ON (u.id = r.unit_id) 
INNER JOIN unit_dimension ud ON (ud.id=u.dimension_id)
WHERE r.station_id = 'ESP0001'
AND r.datetime >= (
    SELECT max(datetime) 
    FROM readings r2 
    WHERE r2.unit_id = r.unit_id)
ORDER BY r.`datetime` DESC, u.id;

다음은 원하는 JSON 구조입니다.

[
  {
    "station_id": "ESP0001",
    "datetime": "2022-11-25T06:43:06.000Z",
    "readings": [
      {
        "dimension": "temperature",
        "value": 15.33,
        "representation": "°C",
        "unit": "Celsius",
        "unit_id": 1
      },
      {
        "dimension": "humidity",
        "value": 92,
        "representation": "%",
        "unit": "Percentage",
        "unit_id": 4
      },
      {
        "dimension": "pressure",
        "value": 1016,
        "representation": "hPa",
        "unit": "HectoPascal",
        "unit_id": 5
      }
    ]
  }
]

다음은 de 데이터베이스 테이블입니다.

  • 단위_차원.
  • 단위.
  • 판독치.

단위_차원 표:

이드 치수
1 온도
2 습도
3 압력.

단위 표:

이드 dimension_id 구성 단위 표상
1 1 섭씨 °C
2 1 화씨 화씨 °F
3 1 켈빈 K
4 2 백분율 %
5 3 헥토 파스칼 hPa

판독치 표:

이드 station_id 데이트 시간 unit_id 가치
1 ESP0001 2022-10-31 01:00:00.000 1 23.5
2 ESP0001 2022-10-31 01:00:00.000 4 79
3 ESP0001 2022-10-31 01:00:00.000 5 1019.6
4 ESP0001 2022-10-31 02:00:00.000 1 23.3
5 ESP0001 2022-10-31 02:00:00.000 4 79
5 ESP0001 2022-10-31 02:00:00.000 5 1019.6
... ... ... ... ...

백엔드는 Nodejs를 사용합니다.

저는 유효한 솔루션 없이 JSON 기능을 사용하려고 했습니다.

이 쿼리의 경우:

SELECT JSON_ARRAYAGG(
    JSON_OBJECT(
        'station_id', station_id, 
        'dt', datetime,
        ud.dimension, value, 
        'representation', u.representation,
        'unit', u.unit 
    )
) AS readings
from readings r 
inner join units u on (u.id = r.unit_id)
inner join unit_dimension ud on (ud.id = u.dimension_id)
where station_id = 'ESP0001'
group by r.`datetime`
order by r.`datetime` desc, ud.id limit 1;

결과:

[
   {"station_id": "ESP0001", "dt": "2022-11-25 07:43:06", "humidity": 92, "representation": "%", "unit": "Percentage"},
   {"station_id": "ESP0001", "dt": "2022-11-25 07:43:06", "temperature": 15.33, "representation": "°C", "unit": "Celsius"},
   {"station_id": "ESP0001", "dt": "2022-11-25 07:43:06", "pressure": 1016, "representation": "hPa", "unit": "HectoPascal"}
]

제가 생각할 수 있는 유일한 해결책은 두 가지 질문을 하는 것입니다.하나는 마지막 datetime을 얻고 다른 하나는 station_id 및 datetime으로 판독값을 가져와 혼합 객체를 만듭니다.

감사합니다!

업데이트:

@Ajax1234 솔루션 쿼리를 사용하여(몇 가지 변경 사항을 적용했습니다):

select json_arrayagg(
   json_object(
     "station_id", t.station_id, 
     "datetime", t.datetime, 
     "readings", t.js
   )
)as "read"
from (
  select 
    r.station_id, 
    r.datetime, 
    json_arrayagg(
      json_object(
        "dimension", ud.dimension, 
        "value", r.value, 
        "representation", u.representation, 
        "unit", u.unit, 
        "unit_id", r.unit_id
      )
    ) js 
   from readings r 
   left join units u on u.id = r.unit_id 
   left join unit_dimension ud on ud.id = u.dimension_id
   WHERE r.station_id = '${req.params.station_id}'
   group by r.station_id, r.datetime
   order by r.datetime DESC, r.unit_id ASC
   LIMIT 20
) t;

결과는 다음과 같습니다.

[
  {
    "read": [
      {
        "station_id": "ESP0001",
        "datetime": "2022-11-28 02:08:46",
        "readings": [
          {
            "dimension": "temperature",
            "value": 12.65,
            "representation": "°C",
            "unit": "Celsius",
            "unit_id": 1
          },
          {
            "dimension": "humidity",
            "value": 79,
            "representation": "%",
            "unit": "Percentage",
            "unit_id": 4
          },
          {
            "dimension": "pressure",
            "value": 1017,
            "representation": "hPa",
            "unit": "HectoPascal",
            "unit_id": 5
          }
        ]
      },
      {
        "station_id": "ESP0001",
        "datetime": "2022-11-28 01:58:46",
        "readings": [
          {
            "dimension": "pressure",
            "value": 1017,
            "representation": "hPa",
            "unit": "HectoPascal",
            "unit_id": 5
          },
          {
            "dimension": "humidity",
            "value": 78,
            "representation": "%",
            "unit": "Percentage",
            "unit_id": 4
          },
          {
            "dimension": "temperature",
            "value": 12.65,
            "representation": "°C",
            "unit": "Celsius",
            "unit_id": 1
          }
        ]
      },
      {
        "station_id": "ESP0001",
        "datetime": "2022-11-28 01:48:46",
        "readings": [
          {
            "dimension": "temperature",
            "value": 12.74,
            "representation": "°C",
            "unit": "Celsius",
            "unit_id": 1
          },
          {
            "dimension": "humidity",
            "value": 77,
            "representation": "%",
            "unit": "Percentage",
            "unit_id": 4
          },
          {
            "dimension": "pressure",
            "value": 1017,
            "representation": "hPa",
            "unit": "HectoPascal",
            "unit_id": 5
          }
        ]
      },
      {
        "station_id": "ESP0001",
        "datetime": "2022-11-28 01:38:46",
        "readings": [
          {
            "dimension": "pressure",
            "value": 1017,
            "representation": "hPa",
            "unit": "HectoPascal",
            "unit_id": 5
          },
          {
            "dimension": "humidity",
            "value": 76,
            "representation": "%",
            "unit": "Percentage",
            "unit_id": 4
          },
          {
            "dimension": "temperature",
            "value": 12.93,
            "representation": "°C",
            "unit": "Celsius",
            "unit_id": 1
          }
        ]
      }
    ]
  }
]

ASC 오더를 할 때도 있고 DESC 오더를 할 때도 있습니다.

먼저 다음을 생성할 수 있습니다."readings"그룹화를 통한 키 집계station_id그리고.datetime그리고 나서 공연을 합니다.json_arrayagg다시 최종 결과를 작성합니다.

select json_arrayagg(json_object("station_id", t.station_id, 
   "datetime", t.datetime, "readings", t.js)) 
from (select r.station_id, r.datetime, json_arrayagg(json_object("dimension", ud.dimension, 
      "value", r.value, 
      "representation", u.representation, 
      "unit", u.unit, "unit_id", u.id)) js 
      from readings r join units u on r.unit_id = u.id 
      join units_dimension ud on ud.id = u.dimension_id
group by r.station_id, r.datetime
order by r.datetime, r.unit_id) t

바이올린을 보다.

또한 이 피들을 참조하여 동일한 결과를 확인하십시오.

언급URL : https://stackoverflow.com/questions/74578642/generate-a-nested-json