Получение JsonMappingException при попытке десериализации Json - PullRequest
0 голосов
/ 10 февраля 2020

Я получаю сообщение об ошибке при попытке сопоставить строку json с объектом DataProduct:

com.fasterxml.jackson.databind.JsonMappingException: N/A (through reference chain: DataProduct["data"]->java.util.ArrayList[0])

Эта строка json была создана при сериализации из того же объекта DataProduct, поэтому я Я запутался в том, как это не может работать, просто глядя на него, кажется, все совпадает

Вот как я пытаюсь отобразить это:

ObjectMapper mapper = new ObjectMapper();
DataProduct dataProduct = mapper.readValue(json, DataProduct.class);

Это это строка json, которую я пытаюсь отобразить:

{ 
   "data":[ 
      { 
         "barcode":"4412312324",
         "description":"Southern Fries",
         "price":2.3,
         "onHand":0.0,
         "Aisle":"25R",
         "Location Code":"101",
         "Section":"Grocery",
         "Date_Removed":"42:53.4",
      }
   ],
   "meta":{ 
      "store":"Store 1",
      "originated":"2020-02-07T20:49:38.105629500Z",
      "correlationId":"a5ea816d-6589-4251-b951-d022a0159352"
   }
}

Вот классы, на которые я пытаюсь отобразить:

@Value
public class DataProduct {
  private List<Product> data;
  private DataProductMetadata meta;
}

@AllArgsConstructor
@Value
public class Product {
  @NonNull
  private String barcode;
  @NonNull
  private String description;
  @NonNull
  private Double price;
  @NonNull
  private Double onHand;

  @JsonIgnore
  @JsonUnwrapped
  private Map<String, Object> customFields;

  @JsonAnyGetter
  public Map<String, Object> getCustomFields() {
    return customFields;
  }

  @JsonAnySetter
  public void setCustomField(String name, Object value) {
    customFields.put(name, value);
  }
}

@Builder
@Value
public class DataProductMetadata {
  @NonNull
  private final String store;
  @NonNull
  private final Instant originated;
  @NonNull
  private final String correlationId;
}

1 Ответ

1 голос
/ 10 февраля 2020

Я обнаружил некоторые проблемы в вашем json и вашем коде:

  1. Ваш json объект data имеет избыточный ,. Это вызывает исключение при разборе.

    "Date_Removed": "42: 53.4",

  2. Вы получите исключение NullPointerException в методе setCustomField, поскольку customFields hasn еще не инициализирован.

  3. originated в DataProductMetadata не является сериализуемым объектом. Вместо этого вы можете использовать Date или другие, которые можно сериализовать.

Вы можете увидеть фиксированную версию здесь

@Data
@RequiredArgsConstructor
public class DataProduct {
  private List<Product> data;
  private DataProductMetadata meta;
}

@Builder
@Data
@RequiredArgsConstructor
@NoArgsConstructor
public class DataProductMetadata {
   @NonNull
   private String store;
   @NonNull
   private Date originated;
   @NonNull
   private String correlationId;
}

@AllArgsConstructor
@RequiredArgsConstructor
@NoArgsConstructor
@Data
public class Product {
   @NonNull
   private String barcode;
   @NonNull
   private String description;
   @NonNull
   private Double price;
   @NonNull
   private Double onHand;

  @JsonIgnore
   @JsonUnwrapped
   private Map<String, Object> customFields =new HashMap<>();;

   @JsonAnyGetter
   public Map<String, Object> getCustomFields() {
      return customFields;
   }

   @JsonAnySetter
   public void setCustomField(String name, Object value) {
      customFields.put(name, value);
   }
}

Из-за некоторых аннотаций lombok, вы следует добавить библиотеку lombok в ваш проект, но я догадался, что вы уже использовали эту библиотеку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...