我使用以下方法将JSON转换为Object:Json:
{ "color": "blue" }
验证码:
somethingDto = objectMapper.readValue(myJson, SomethingDTO.class);
但是,假设JSON的格式如下:
{ "something": { "color": "blue" } }
什么代码可以达到同样的效果?
编辑:“某”的旁边可能还有更多的属性
cetgtptt1#
如果JSON格式为:
如果你想把它Map到一个SomethingDTO类的对象,它有一个color属性,你需要更新代码如下:
SomethingDTO
color
ObjectMapper objectMapper = new ObjectMapper(); JsonNode jsonNode = objectMapper.readTree(myJson); JsonNode somethingNode = jsonNode.get("something"); SomethingDTO somethingDto = objectMapper.treeToValue(somethingNode, SomethingDTO.class);
在这里,我们首先创建一个ObjectMapper的示例,用于将JSON数据Map到Java对象。然后,我们使用ObjectMapper的readTree()方法将JSON字符串读入JsonNode对象。这允许我们使用JsonNode的get()方法浏览JSON数据。我们使用get()方法从JsonNode对象中获取something节点。这为我们提供了一个JsonNode对象,表示JSON数据中的something节点。最后,我们使用ObjectMapper的treeToValue()方法将表示something节点的JsonNode对象转换为SomethingDTO类的示例。treeToValue()方法将JsonNode对象和目标类(SomethingDTO.class)作为参数,并返回目标类的示例,其属性由JSON数据填充。通过这样做,我们能够将JSON数据Map到SomethingDTO对象,即使它具有嵌套结构。
ObjectMapper
readTree()
JsonNode
get()
something
treeToValue()
SomethingDTO.class
pnwntuvh2#
您应该为它创建一个根类,例如
public class RootDto { SomethingDTO somthing; public SomethingDTO getSomething() { return somthing; } public void setSomething(SomethingDTO somthing) { this.somthing = somthing; } }
然后将JSONMap到它
RootDto rootDto = objectMapper.readValue(myJson, RootDto.class);
或者你可以使用JsonNode
JsonNode rootNode = objectMapper.readTree(myJson); JsonNode somethingNode = rootNode.get("something"); SomethingDTO somethingDto = objectMapper.convertValue(somethingNode, SomethingDTO.class);
同样,你也可以用这种方式处理它们
JsonNode rootNode = objectMapper.readTree(myJson); JsonNode somethingNode = rootNode.get("something"); SomethingDTO somethingDto; if (somethingNode != null) { somethingDto = objectMapper.convertValue(somethingNode, SomethingDTO.class); } else { somethingDto = objectMapper.convertValue(rootNode, SomethingDTO.class); }
xfb7svmp3#
Therre是一个名为@JsonRootName的注解,它类似于@XmlRootElement。该注解指示“根” Package 的名称。
@JsonRootName
@XmlRootElement
@JsonRootName("something") public class SomethingDto { String color; public String getColor() { return color; } public SomethingDto setColor(String color) { this.color = color; return this; } }
之后,必须启用fearure:
ObjectMapper om = new ObjectMapper() .enable(SerializationFeature.WRAP_ROOT_VALUE) .enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
现在,它将把对象 Package /展开到所需的根元素。
class WrapTest { private static final ObjectMapper om = new ObjectMapper() .enable(SerializationFeature.WRAP_ROOT_VALUE) .enable(DeserializationFeature.UNWRAP_ROOT_VALUE); //language=json private static final String input = """ { "something": { "color" : "blue" } } """; @Test void wrappedTest() throws JsonProcessingException { var dto = om.readValue(input, SomethingDto.class); Assertions.assertAll( () -> assertNotNull(dto), () -> assertEquals("blue", dto.getColor(), "color field mismatch") ); } }
3条答案
按热度按时间cetgtptt1#
如果JSON格式为:
如果你想把它Map到一个
SomethingDTO
类的对象,它有一个color
属性,你需要更新代码如下:在这里,我们首先创建一个
ObjectMapper
的示例,用于将JSON数据Map到Java对象。然后,我们使用ObjectMapper的readTree()
方法将JSON字符串读入JsonNode
对象。这允许我们使用JsonNode
的get()
方法浏览JSON数据。我们使用
get()
方法从JsonNode
对象中获取something
节点。这为我们提供了一个JsonNode
对象,表示JSON数据中的something
节点。最后,我们使用
ObjectMapper
的treeToValue()
方法将表示something节点的JsonNode对象转换为SomethingDTO
类的示例。treeToValue()
方法将JsonNode对象和目标类(SomethingDTO.class
)作为参数,并返回目标类的示例,其属性由JSON数据填充。通过这样做,我们能够将JSON数据Map到
SomethingDTO
对象,即使它具有嵌套结构。pnwntuvh2#
您应该为它创建一个根类,例如
然后将JSONMap到它
或者你可以使用JsonNode
同样,你也可以用这种方式处理它们
xfb7svmp3#
Therre是一个名为
@JsonRootName
的注解,它类似于@XmlRootElement
。该注解指示“根” Package 的名称。之后,必须启用fearure:
现在,它将把对象 Package /展开到所需的根元素。