ObjectMapper, сопоставленный с POJO, возвращает ноль - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть простой Json в следующей форме:

{
  "products": [
    {
      "id": 1,
      "productSku": "123",
      "productInventory": "24"
    },
    {
      "id": 2,
      "productSku": "12350",
      "productInventory": "22"
    },
    {
      "id": 3,
      "productSku": "12351",
      "productInventory": "19"
    }
  ]
}

Я беру этот Json через локальный URL-адрес и пытаюсь сопоставить его с классом POJO в другом приложении Spring Boot, которое выполняется на другом порту. Класс POJO, соответствующий вышеупомянутому Json:

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonRootName(value = "products")
public class Product {

    private Integer id;
    private String productSku;
    private String productInventory;

    //getters and setters omitted


}

Ниже приведен мой контроллер, который обрабатывал сопоставление и привязку:

@ResponseBody
    @GetMapping("index")
    public String getIndex() throws JsonParseException, 
       JsonMappingException, IOException {

        URL ApiUrlJson = new URL("http://localhost:1990/product");

        ObjectMapper mapper = new ObjectMapper();

        Product product = mapper.readValue(ApiUrlJson, Product.class);
        System.out.println(product.getProductInventory());

        return "Processed!";
    }

Когда я запускаю приложение и обращаюсь к индексу, чтобы получить значение определенной переменной, вывод всегда равен нулю, и я не уверен, что мне не хватает?

Ответы [ 3 ]

2 голосов
/ 19 апреля 2019

У вас есть список продуктов в вашем файле JSON. Вы десериализуете один объект с 3 полями. Ни одно из этих полей не относится к продуктам, но вы игнорируете пропущенные поля.

Попробуйте десериализовать в новый класс, содержащий список Product. Удалить @ JsonRootName

1 голос
/ 19 апреля 2019

Вы пытаетесь десериализовать массив JSON.Также не опускайте сеттеры, так как доступ к этой переменной является закрытым.Вы можете сослаться на код ниже.Я проверил его и могу его десериализовать должным образом.

@JsonIgnoreProperties(ignoreUnknown = true)
class Product {

  private Integer id;
  private String productSku;
  private String productInventory;

  public Integer getId() {
    return id;
  }

  public void setId(Integer id) {
    this.id = id;
  }

  public String getProductSku() {
    return productSku;
  }

  public void setProductSku(String productSku) {
    this.productSku = productSku;
  }

  public String getProductInventory() {
    return productInventory;
  }

  public void setProductInventory(String productInventory) {
    this.productInventory = productInventory;
  }
}

class Products{

  private List<Product> products;

  public List<Product> getProducts() {
    return products;
  }

  public void setProducts(List<Product> products) {
    this.products = products;
  }
}

public class Main{

  public static void main(String[] args) throws Exception{
    String jsonString =
        "{\n"
            + "  \"products\": [\n"
            + "    {\n"
            + "      \"id\": 1,\n"
            + "      \"productSku\": \"123\",\n"
            + "      \"productInventory\": \"24\"\n"
            + "    },\n"
            + "    {\n"
            + "      \"id\": 2,\n"
            + "      \"productSku\": \"12350\",\n"
            + "      \"productInventory\": \"22\"\n"
            + "    },\n"
            + "    {\n"
            + "      \"id\": 3,\n"
            + "      \"productSku\": \"12351\",\n"
            + "      \"productInventory\": \"19\"\n"
            + "    }\n"
            + "  ]\n"
            + "}";

    ObjectMapper mapper = new ObjectMapper();
    Products products = mapper.readValue(jsonString, Products.class);
    // To just access list of ids
    List<Product> productsList= products.getProducts();
    List<Integer> productIds = new ArrayList<>();
    for(Product product : productsList){
      productIds.add(product.getId());
    }
    System.out.println(productIds);
    }
}
0 голосов
/ 19 апреля 2019

У вас есть объект, и внутри этого объекта находится список объектов. т.е.

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonRootName(value = "products")
public class Products {
    private List<Product> products;

    public List<Product> getProducts() {
        return products;
    }

    public void setProducts(final List<Product> products) {
        this.products = products;
    }
}


public class Product{
.....
}

ObjectMapper objectMapper = new ObjectMapper();
Products product = objectMapper.readValue("json here....", Products.class);
System.out.println(product.getProducts().size());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...