programing

어레이가 포함된 오브젝트 어레이의 시리얼화 해제

powerit 2023. 4. 3. 21:46
반응형

어레이가 포함된 오브젝트 어레이의 시리얼화 해제

Gson을 사용하여 웹 서비스에서 반환된 json 문자열을 역직렬화하려고 합니다.

구조는 다음과 같이 반환됩니다.TypeDTO[].

어디에TypeDTO~와 같다

int id;
String name;
ArrayList<ItemDTO> items[] 

및 항목DTO는 마치

int id;
String name;
Boolean valid;

내가 다음과 같이 코드를 호출하면

Gson gson = new Gson();
TypeDTO[] mytypes = (TypeDTO[]) gson.fromJson(reply, TypeDTO[].class);

개체 내부의 모든 것이 null입니다.

단, 이 명령어를 사용하면

JSONArray그리고.JSONObjectorg.json 항아리에서 그것들을 하나씩 꺼내는 것은 정상 작동하며 필드도 그에 따라 채워집니다.

내가 뭘 잘못하고 있는지 짐작 가는 거라도?Gson은 매우 빠릅니까?아니면 내가 이미 하고 있는 일을 계속하는 게 좋을까?

고마워요, 데이빗

원래 질문의 Java 데이터 구조 예제가 주석의 JSON 구조 설명과 일치하지 않습니다.

JSON은 다음과 같이 설명됩니다.

"{object} 배열이 {object}인 {object} 배열"

질문에 기재되어 있는 타입의 관점에서 JSON은 JSON 구조와 일치하는 Java 데이터 구조로 변환되어 Gson과 쉽게 역직렬화됩니다.

{Item} 배열이 있는 {TypeDTO 개체 배열DTO object}}."

그러나 질문에서 제공된 Java 데이터 구조는 이것이 아닙니다.그 대신에

{Item} 배열이 있는 {TypeDTO 객체 배열DTO object}}."

2차원 배열!=단차원 배열.

이 첫 번째 예에서는 Gson을 사용하여 "{object} 배열과 {object} 배열"인 JSON 구조를 간단히 역직렬화 및 직렬화하는 방법을 보여 줍니다.

input.json 내용:

[
  {
    "id":1,
    "name":"name1",
    "items":
    [
      {"id":2,"name":"name2","valid":true},
      {"id":3,"name":"name3","valid":false},
      {"id":4,"name":"name4","valid":true}
    ]
  },
  {
    "id":5,
    "name":"name5",
    "items":
    [
      {"id":6,"name":"name6","valid":true},
      {"id":7,"name":"name7","valid":false}
    ]
  },
  {
    "id":8,
    "name":"name8",
    "items":
    [
      {"id":9,"name":"name9","valid":true},
      {"id":10,"name":"name10","valid":false},
      {"id":11,"name":"name11","valid":false},
      {"id":12,"name":"name12","valid":true}
    ]
  }
]

Foo.java:

import java.io.FileReader;
import java.util.ArrayList;

import com.google.gson.Gson;

public class Foo
{
  public static void main(String[] args) throws Exception
  {
    Gson gson = new Gson();
    TypeDTO[] myTypes = gson.fromJson(new FileReader("input.json"), TypeDTO[].class);
    System.out.println(gson.toJson(myTypes));
  }
}

class TypeDTO
{
  int id;
  String name;
  ArrayList<ItemDTO> items;
}

class ItemDTO
{
  int id;
  String name;
  Boolean valid;
}

이 두 번째 예에서는 JSON 구조를 대신 사용합니다.이 구조는 실제로는 {TypeDTO 객체의 배열과 {Item} 배열입니다.DTO object}"는 원래 제공된 Java 데이터 구조와 일치합니다.

input.json 내용:

[
  {
    "id":1,
    "name":"name1",
    "items":
    [
      [
        {"id":2,"name":"name2","valid":true},
        {"id":3,"name":"name3","valid":false}
      ],
      [
        {"id":4,"name":"name4","valid":true}
      ]
    ]
  },
  {
    "id":5,
    "name":"name5",
    "items":
    [
      [
        {"id":6,"name":"name6","valid":true}
      ],
      [
        {"id":7,"name":"name7","valid":false}
      ]
    ]
  },
  {
    "id":8,
    "name":"name8",
    "items":
    [
      [
        {"id":9,"name":"name9","valid":true},
        {"id":10,"name":"name10","valid":false}
      ],
      [
        {"id":11,"name":"name11","valid":false},
        {"id":12,"name":"name12","valid":true}
      ]
    ]
  }
]

Foo.java:

import java.io.FileReader;
import java.util.ArrayList;

import com.google.gson.Gson;

public class Foo
{
  public static void main(String[] args) throws Exception
  {
    Gson gson = new Gson();
    TypeDTO[] myTypes = gson.fromJson(new FileReader("input.json"), TypeDTO[].class);
    System.out.println(gson.toJson(myTypes));
  }
}

class TypeDTO
{
  int id;
  String name;
  ArrayList<ItemDTO> items[];
}

class ItemDTO
{
  int id;
  String name;
  Boolean valid;
}

나머지 두 가지 질문에 대해:

Gson은 매우 빠릅니까?

다른 역직렬화/직렬화 API와 비교되지 않습니다.Gson은 전통적으로 가장 느린 에 속했다.Gson의 현재 출시와 다음 출시에는 상당한 성능 개선이 포함되어 있다고 합니다만, 이러한 주장을 뒷받침하는 최신 성능 테스트 데이터는 아직 찾지 못했습니다.

즉, Gson이 요구에 충분히 빠른 경우 JSON 역직렬화를 매우 쉽게 할 수 있기 때문에 Gson을 사용하는 것이 합리적일 수 있습니다.더 나은 퍼포먼스가 필요한 경우 잭슨이 더 나은 선택일 수 있습니다.그것은 Gson의 편리함의 많은 부분(아마도 모든 것)을 제공한다.

아니면 내가 이미 하고 있는 일을 계속하는 게 좋을까?

난 안 그럴 거야저는 항상 다음과 같은 간단한 코드 한 줄을 가지고 싶습니다.

TypeDTO[] myTypes = gson.fromJson(new FileReader("input.json"), TypeDTO[].class);

...각 컴포넌트를 한 번에 하나씩 매핑하는 데 필요한 30줄의 코드보다 복잡한 데이터 구조로 쉽게 역직렬화할 수 있습니다.

JSON 데이터가 배열 개체로 시작하는 경우 bean 클래스를 다음과 같이 사용합니다.도움이 됩니다.

Users[] bean = gson.fromJson(response,Users[].class);

사용자는 나의 빈 클래스입니다.

응답은 JSON 데이터입니다.

언급URL : https://stackoverflow.com/questions/3763937/gson-and-deserializing-an-array-of-objects-with-arrays-in-it

반응형