如何使用 Jackson 解析嵌套的 json 对象

How to parse nested json object as it is using Jackson

我有以下 JSON 结构:

{
   "sets": [
      {...},
      {
         "id": "id",
         "html": "<html></html>",
         "javascript": "{onError: function (event) {}}",
         "css": ".someclass {}",
         "translations": {
            "en": { "LABEL_1": "Some label text", "HEADER_1": "Some header text" },
            "fr": { "LABEL_1": "Some label text", "HEADER_1": "Some header text" }
         }
      }
   ]
}

我有一个代表此 JSON 的对象用于反序列化目的

@Data //Lombok
@NoArgsConstructor //Lombok
public class Set {
   @JsonProperty("screenSetID")
    private String screenSetID;
    @JsonProperty("html")
    private String html;
    @JsonProperty("css")
    private String css;
    @JsonProperty("javascript")
    private String javascript;
    @JsonProperty("translations")
    private String translations;
}

我有下面一段代码要反序列化JSON

private List<Set> parseSetsData(String json) {
   ObjectMapper mapper = new ObjectMapper();
   
   try {
     return mapper.readValue(json, TypeReference<List<Set>(){});
   } catch (IOException e) {
     throw new RuntimeException(e);
   }
}

如何按原样解析 translations JSON 对象?

我相信您明白您想要的是 on array hats 的一部分,为什么我必须使用 for 循环:

ObjectMapper mapper = new ObjectMapper();
JsonNode treeNode = mapper.readTree(json);
treeNode=treeNode.findValue("sets");
for (Iterator<JsonNode> it = treeNode.elements(); it.hasNext(); ) {
   JsonNode node = it.next();
   String theValueYouWant=node.findValue("translations").textValue();
}

任何 Jason 对象都可以映射到 Map<String, Object>,任何 Json 列表都可以映射到 List<Object>。因此,您可以按如下方式解析 JSON:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModules(new JavaTimeModule());
objectReader = objectMapper.reader();
Map<String, Object> parsedJson = (Map<String, Object>)objectReader.forType(Map.class).readValue(jsonString)

请注意,您的 JSON 是一个 JSON 对象而不是 JSON 列表,因此此示例将其解析为 Map

Json 我发现当您反序列化您的项目时,它应该如下所示;

public class En
{
    @JsonProperty("LABEL_1")
    public String lABEL_1;
    @JsonProperty("HEADER_1")
    public String hEADER_1;
}

public class Fr
{
    @JsonProperty("LABEL_1")
    public String lABEL_1;
    @JsonProperty("HEADER_1")
    public String hEADER_1;
}

public class Translations
{
    public En en;
    public Fr fr;
}

public class Set
{
    public String id;
    public String html;
    public String javascript;
    public String css;
    public Translations translations;
}

然而,在您的 class 中,“translations” 是一个字符串,但在 JSON 结构中,它指向一个对象。