在 spring 引导中反序列化 jackson
Deserialize jackson in spring boot
我通过调用 RestTemplate
获得了两种类型的 json
{"results":[{"testing":{"name":"soham"}},{"testing":{"firstname":"john","lastname":"don"}}]}
现在我正在使用 JsonDeserializer 解析数据
public class CustomJacksonDeserialize extends JsonDeserializer<Activity> {
@Override
public Activity deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws
IOException, NullPointerException {
ObjectMapper objectMapper = new ObjectMapper();
JsonNode actualObj = objectMapper.readTree(jsonParser.getValueAsString());
return new Activity(actualObj.get("name").asText());
}
}
这是我的 class
@JsonDeserialize(using = CustomJacksonDeserialize.class)
public class Activity {
private String name;
public Activity(String name) {
this.name = name;
}
}
现在我的问题是如何解析这个 json。@JsonDeserialize
对这个 case.Any 其他选项没有帮助吗?或者在这种情况下如何使用 @JsonDeserialize
.
您可以这样修改 CustomJacksonDeserialize
:
class CustomJacksonDeserialize extends JsonDeserializer<Activity> {
@Override
public Activity deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException,
NullPointerException {
JsonNode jsonNode = jsonParser.readValueAsTree();
String name=jsonNode.get("results").get(0).get("testing").get("name").asText();
return new Activity(name);
}
}
第二种方法:
或者,如果您也可以使用对象映射器本身反序列化 JSON 这不需要 CustomJacksonDeserialize :
String jsonString = "{\"results\":[{\"testing\":{\"name\":\"soham\"}},{\"testing\":{\"firstname\":\"john\",\"lastname\":\"don\"}}]}";
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(jsonString);
JsonNode resultNode=jsonNode.get("results");
String name = resultNode.get(0).get("testing").get("name").asText();
Activity activity=new Activity(name);
String firstName= resultNode.get(1).get("testing").get("firstname").asText();
String lastName= resultNode.get(1).get("testing").get("lastname").asText();
Activity2 activity2=new Activity2(firstName, lastName);
注意:我已经为给定的 JSON 提取了 name
、firstname
和 lastname
的值,您可以修改此逻辑相应。
第三种方法: 在这里我可以遍历 JSON 数组并将创建两个活动的单独对象:
String jsonString = "{\"results\":[{\"testing\":{\"name\":\"soham\"}},{\"testing\":{\"firstname\":\"john\",\"lastname\":\"don\"}}]}";
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(jsonString);
JsonNode resultNode = jsonNode.get("results");
List<Activity> activityList1 = new ArrayList<Activity>();
List<Activity2> activityList2 = new ArrayList<Activity2>();
for (int i = 0; i < resultNode.size(); i++) {
JsonNode testingNode = resultNode.get(i).get("testing");
if (testingNode.has("name")) {
String name = testingNode.get("name").asText();
Activity activity = new Activity(name);
activityList1.add(activity);
}
if (testingNode.has("firstname")) {
String firstName = testingNode.get("firstname").asText();
String lastName = testingNode.get("lastname").asText();
Activity2 activity2 = new Activity2(firstName, lastName);
activityList2.add(activity2);
}
}
我通过调用 RestTemplate
获得了两种类型的 json{"results":[{"testing":{"name":"soham"}},{"testing":{"firstname":"john","lastname":"don"}}]}
现在我正在使用 JsonDeserializer 解析数据
public class CustomJacksonDeserialize extends JsonDeserializer<Activity> {
@Override
public Activity deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws
IOException, NullPointerException {
ObjectMapper objectMapper = new ObjectMapper();
JsonNode actualObj = objectMapper.readTree(jsonParser.getValueAsString());
return new Activity(actualObj.get("name").asText());
}
}
这是我的 class
@JsonDeserialize(using = CustomJacksonDeserialize.class)
public class Activity {
private String name;
public Activity(String name) {
this.name = name;
}
}
现在我的问题是如何解析这个 json。@JsonDeserialize
对这个 case.Any 其他选项没有帮助吗?或者在这种情况下如何使用 @JsonDeserialize
.
您可以这样修改 CustomJacksonDeserialize
:
class CustomJacksonDeserialize extends JsonDeserializer<Activity> {
@Override
public Activity deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException,
NullPointerException {
JsonNode jsonNode = jsonParser.readValueAsTree();
String name=jsonNode.get("results").get(0).get("testing").get("name").asText();
return new Activity(name);
}
}
第二种方法: 或者,如果您也可以使用对象映射器本身反序列化 JSON 这不需要 CustomJacksonDeserialize :
String jsonString = "{\"results\":[{\"testing\":{\"name\":\"soham\"}},{\"testing\":{\"firstname\":\"john\",\"lastname\":\"don\"}}]}";
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(jsonString);
JsonNode resultNode=jsonNode.get("results");
String name = resultNode.get(0).get("testing").get("name").asText();
Activity activity=new Activity(name);
String firstName= resultNode.get(1).get("testing").get("firstname").asText();
String lastName= resultNode.get(1).get("testing").get("lastname").asText();
Activity2 activity2=new Activity2(firstName, lastName);
注意:我已经为给定的 JSON 提取了 name
、firstname
和 lastname
的值,您可以修改此逻辑相应。
第三种方法: 在这里我可以遍历 JSON 数组并将创建两个活动的单独对象:
String jsonString = "{\"results\":[{\"testing\":{\"name\":\"soham\"}},{\"testing\":{\"firstname\":\"john\",\"lastname\":\"don\"}}]}";
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(jsonString);
JsonNode resultNode = jsonNode.get("results");
List<Activity> activityList1 = new ArrayList<Activity>();
List<Activity2> activityList2 = new ArrayList<Activity2>();
for (int i = 0; i < resultNode.size(); i++) {
JsonNode testingNode = resultNode.get(i).get("testing");
if (testingNode.has("name")) {
String name = testingNode.get("name").asText();
Activity activity = new Activity(name);
activityList1.add(activity);
}
if (testingNode.has("firstname")) {
String firstName = testingNode.get("firstname").asText();
String lastName = testingNode.get("lastname").asText();
Activity2 activity2 = new Activity2(firstName, lastName);
activityList2.add(activity2);
}
}