如何使用 Jackson Java 从 JSON 读取值

How to read value from JSON with Jackson Java

我有一个 JSON 文件:

{
    "param": {
        "rows": 1,
        "columns": "4"
    },
    "items": [{
        "name": "A",
        "amount": 33,
        "price": "43"
    }, {
        "name": "B",
        "amount": 43,
        "price": "2"
    }, {
        "name": "C",
        "amount": 45,
        "price": "1"
    }, {
        "name": "D",
        "amount": 543,
        "price": "55" 
   }]
}

我想单独取货。我尝试去做,结果做了 null:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

Items item; // only items
item =  objectMapper.readValue(new File("D:/example/file.json"), Items.class);
System.out.println(item.getAmount());

这是 class 项:

public class Items {
    private String name;
    private String amount;
    private double price;

    public Items() {
        super();
    }

    //constructor

    //getters and setters
}

我做错了什么?如何正确读取物品的价值?

您应该将其读作 Map ,然后使用您的地图作为来源来填充您的项目。此外,有一个开源库具有基于 Jackson 库的功能,真正简化了 reading/writing 对象 from/to Json。如果你有一个 json 字符串,你所要做的就是:

Map<String, Object> map = JsonUtils.readObjectFromJsonString(jsonString, Map.class);

尽管它会抛出 IOException,因此您需要处理它。这是Javadoc. The library is called MgntUtils and could be found as Maven artifact and on the Github(包括javadoc和源代码)

你没有正确处理 JSON 数组 - items - 正如我在 OP 下评论的那样,你需要做的就是重命名原始 class ItemsItem 并创建另一个 class Items 如下,Jackson 库将为您完成剩下的工作:

public class Item {
    private String name;
    private String amount;
    private double price;

    // general getters/setters
}

public class Items {
    private List<Item> items;

    // general getter/setter
}

然后您可以使用您的代码片段反序列化 JSON 字符串:

Items items = objectMapper.readValue(new File("D:/example/file.json"), Items.class);
System.out.println(items.get(0).getAmount());

首先,你需要有一个包含List item的对象,因为JSON文件有多个item,不是只有一个,你可以参考我的代码

  public class ItemsList {
    private List<Items> items;

    public ItemsList () {
    }
}

我们将修改映射器

        item=  objectMapper.readValue(new File("D:/example/file.json"), ItemsList.class);

但我认为您应该将 class 从 Items => Item

希望能帮到您解决问题

我建议你轻松拥有以下类、Example.java、Param.java、Item.java:

Example.java:

public class Example {
    private Param param;
    private List<Item> items;

    //constructor

    //getters and setters
}


Param.java:

public class Param {

    private int rows;
    private int columns;

    //constructor

    //getters and setters
}

Item.java

public class Item {
    private String name;
    private String amount;
    private double price;
 }

那你可以这样写:

 Example  example=  objectMapper.readValue(new File("D:/example/file.json"), 
 Example.class);

  for(Item item: example.getItems())
        System.out.println(item.getAmount());

这里的问题是因为您的 JSON 文件的结构与您在 ObjectMapper.readValue 方法中作为第二个参数传递的 class 的结构不对应(Items.class 在你的例子中)。您需要对齐两个结构。 根据文件结构,您的 Items 文件应该是下一个

public class Items {
    private Param param;
    private List<Item> items;

    // Getters & Setters
}

另外你需要创建 class Param:

public class Param {
    private Integer rows;
    private Integer columns;

    // Getters & Setters
}

和class Item:

public class Item {
    private String name;
    private String amount;
    private double price;

    // Getters & Setters
}

之后您将能够通过下一个片段读取您的文件:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Items items = objectMapper.readValue(new File("D:/example/file.json"), Items.class);
items.getItems().stream().map(Item::getAmount).forEach(System.out::println);