gpt4 book ai didi

java - Jackson 的 XML 映射没有字符串参数构造函数/工厂方法来从字符串值 ('Belgian Waffles' 反序列化)

转载 作者:行者123 更新时间:2023-12-02 09:47:02 26 4
gpt4 key购买 nike

出于学习目的,我尝试将 xml 文件映射到 pojo。我的 xml 如下所示:

<breakfast_menu>
<food>
<name>Belgian Waffles</name>
<price>$5.95</price>
<description>
Two of our famous Belgian Waffles with plenty of real maple syrup
</description>
<calories>650</calories>
</food>
<food>
<name>Strawberry Belgian Waffles</name>
<price>$7.95</price>
<description>
Light Belgian waffles covered with strawberries and whipped cream
</description>
<calories>900</calories>
</food>
</breakfast_menu>

Breakfes实体类

@JacksonXmlRootElement(localName = "breakfast_menu")
public class BreakfestFood {

private List<Food> food;

public BreakfestFood() {}

public List<Food> getFood() {
return food;
}

public void setFood(List<Food> food) {
this.food = food;
}

}

食品实体类

@JacksonXmlRootElement(localName = "food")
public class Food {

@JacksonXmlProperty(localName = "name")
private String name;
@JacksonXmlProperty
private double price;
@JacksonXmlProperty
private String description;
@JacksonXmlProperty
private int calories;

主要功能:

public static void main(String[] args) {
File file = new File("X:\\food.xml");
XmlMapper xmlMapper = new XmlMapper();

try {
String xml = inputStreamToString(new FileInputStream(file));
BreakfestFood value = xmlMapper.readValue(xml, BreakfestFood.class);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

当我运行此代码时,我得到的堆栈如下:用于从字符串值(“比利时华夫饼”)反序列化的字符串参数构造函数/工厂方法。所以它似乎无法映射食物的名称值。有人知道出了什么问题吗?

最佳答案

您的映射不正确。为了检查问题所在,我鼓励您序列化一个简单的对象。

BreakfestFood bf = new BreakfestFood();
Food f1 = new Food();
f1.setName("f1Name");
f1.setCalories(20);
f1.setDescription("desc");
f1.setPrice(11.1);
bf.setFood(List.of(f1));

System.out.println(xmlMapper.writeValueAsString(bf));

Output:
<breakfast_menu>
<food>
<food>
<price>11.1</price>
<description>desc</description>
<calories>20</calories>
<name>f1Name</name>
</food>
</food>
</breakfast_menu>

如您所见,您获得了列表的额外包装。要摆脱它,请使用:

@JacksonXmlRootElement(localName = "breakfast_menu")
public class BreakfestFood {

// Use this to change element name:
// @JacksonXmlProperty(localName = "food")
@JacksonXmlElementWrapper(useWrapping = false)
private List<Food> food;

// getters and setters
}

最重要的是:

  • 如果您有公共(public) getter,则 Food 中的注释是多余的
  • 价格标签中的值不是双倍的。您需要调整映射来解析货币值。自定义 @JsonSerialize@JsonDeserialize 是解决这个问题的一个想法。
  • 更一般而言,将价格存储为双倍并不是一个好主意。

关于java - Jackson 的 XML 映射没有字符串参数构造函数/工厂方法来从字符串值 ('Belgian Waffles' 反序列化),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56568024/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com