如何使用 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 结构中,它指向一个对象。
我有以下 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 结构中,它指向一个对象。