java 如何使用ObjectMapper将JSON属性转换为对象

r7knjye2  于 2023-04-04  发布在  Java
关注(0)|答案(3)|浏览(204)

我使用以下方法将JSON转换为Object:
Json:

{
     "color": "blue"
}

验证码:

somethingDto = objectMapper.readValue(myJson, SomethingDTO.class);

但是,假设JSON的格式如下:

{
    "something": {
         "color": "blue"
    }
}

什么代码可以达到同样的效果?

编辑:“某”的旁边可能还有更多的属性

cetgtptt

cetgtptt1#

如果JSON格式为:

{
    "something": {
         "color": "blue"
    }
}

如果你想把它Map到一个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对象。这允许我们使用JsonNodeget()方法浏览JSON数据。
我们使用get()方法从JsonNode对象中获取something节点。这为我们提供了一个JsonNode对象,表示JSON数据中的something节点。
最后,我们使用ObjectMappertreeToValue()方法将表示something节点的JsonNode对象转换为SomethingDTO类的示例。treeToValue()方法将JsonNode对象和目标类(SomethingDTO.class)作为参数,并返回目标类的示例,其属性由JSON数据填充。
通过这样做,我们能够将JSON数据Map到SomethingDTO对象,即使它具有嵌套结构。

pnwntuvh

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);
}
xfb7svmp

xfb7svmp3#

Therre是一个名为@JsonRootName的注解,它类似于@XmlRootElement。该注解指示“根” Package 的名称。

@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")
        );
    }
}

相关问题