有什么方法可以从多个数组创建具有属性的对象?

时间:2019-10-21 11:57:28

标签: java json jackson

我有一个菜单的JSON文件。因此,存在一个带有披萨的数组,该数组内部是一个名为ingredient的数组,其中包含来自成分的id

所以我想创建具有pizza数组的属性和ingredient数组的值的对象。

我的错误如下:

  

java.lang.IllegalArgumentException(在START_OBJECT令牌之外)

我已经创建了一个仅访问pizza数组的对象。 在代码中,您可以看到我如何尝试对其进行转换。

代码段

public static void main(String[] args) 
throws JsonGenerationException, JsonMappingException, IOException
{
//File file = new File("path");
ObjectMapper mapper = new ObjectMapper();

try
{
    JsonNode gesMenu = mapper.readValue(file, JsonNode.class);
    JsonNode jMenu = gesMenu.get("Menu");
    JsonNode gesIngredient = jMenu.get("ingredient");

    Ingredient[] cIngredient = mapper.convertValue(gesIngredient, Ingredient[].class);
    System.out.println(cIngredient[7].getDescription());;

    JsonNode gesPizza = jMenu.get("pizza");
    System.out.println("\n" + gesPizza);

    //These last two lines cause Errors
    Pizza2[] pPizza = mapper.convertValue(gesPizza, Pizza2[].class);
    System.out.println(pPizza[0]);

}
...

这是JSON文件的示例:

{
  "menu" : {
    "pizza" : [
      {
        "nr" : 1,
        "description" : "Pizza Salami",
        "ingredient" : [
          {
            "id" : 0
          }
        ],
        "Picture" : "Salami.jpg"
      }
    ]
  }
}

1 个答案:

答案 0 :(得分:1)

根据您提供的JSON字符串的结构以及您在注释中提到的内容,有一种简单的方法可以将整个JSON字符串转换为嵌套的POJO,如下所示:

ObjectMapper mapper = new ObjectMapper();
MyJsonObject myJsonObj = mapper.readValue(jsonStr, MyJsonObject.class);
System.out.println(myJsonObj.toString());

控制台输出

  

MyJsonObject [menu =菜单[pizza = [Pizza [nr = 1,description = Pizza Salami,Ingredient = [Ingredient [id = 0,description = null,priceSmall = null,priceMedium = null,priceBig = null]]]], picture = Salami.jpg]]]]

嵌套的POJO看起来像:

class MyJsonObject {
    private Menu menu;
    //general getters and setters
    //toString()
}

class Menu {
    private List<Pizza> pizza;
    //general getters and setters
    //toString()
}

class Pizza {
    private int nr;
    private String description;
    private List<Ingredient> ingredient;
    @JsonProperty("Picture")
    private String picture;
    //general getters and setters
    //toString()
}

class Ingredient {
    private int id;
    private String description;
    private String priceSmall;
    private String priceMedium;
    private String priceBig;
    //general getters and setters
    //toString()
}

然后,您可以像访问Java中的对象一样轻松访问pizzaingredient JSON数组!