【问题标题】:Deserialize jackson in spring boot在弹簧靴中反序列化杰克逊
【发布时间】:2015-08-18 17:20:48
【问题描述】:

我通过调用 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());
    }
}

这是我的课

@JsonDeserialize(using = CustomJacksonDeserialize.class)
public class Activity {

    private String name;

    public Activity(String name) {
        this.name = name;
    }
}

现在我的问题是如何解析这个 json。@JsonDeserialize 在这种情况下没有帮助。还有其他选择吗?或者在这种情况下如何使用@JsonDeserialize

【问题讨论】:

    标签: java json jackson spring-boot


    【解决方案1】:

    你可以像这样修改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);
        }
    } 
    

    第二种方法: 或者,如果您还可以使用 Object mapper 本身反序列化此 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 提取了 namefirstnamelastname 的值,您可以相应地修改此逻辑。

    第三种方法:在这里我可以遍历 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);
    
                }
    
            }
    

    【讨论】:

    • 我也想在不同的 Pojo 类中获取名字和姓氏?
    • 您可以为另一个类再创建一个反序列化器,在该反序列化器中您可以返回另一个 POJO 类的实例,
    • @Soham 我已经更新了我的答案,我认为第二种方法更适合您的要求。
    • 你没有明白我的意思,我不能从 CustomJacksonDeserialize 返回 Activity 和 Activity2。那么解决方案是什么?我是否必须使用两个 CustomJacksonDeserialize 类,如果必须那么如何?
    • 嘿,请再次查看我的答案,我添加了另一种不需要任何 CustomJacksonDeserializer 的方法
    猜你喜欢
    • 2021-05-28
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    • 2012-11-19
    相关资源
    最近更新 更多