Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将JSON中嵌入的JSON字符串转换为java对象?_Java_Json_Jackson_Jackson Databind - Fatal编程技术网

如何将JSON中嵌入的JSON字符串转换为java对象?

如何将JSON中嵌入的JSON字符串转换为java对象?,java,json,jackson,jackson-databind,Java,Json,Jackson,Jackson Databind,我有下面的json,其中body键包含一个值,该值是json对象的字符串表示形式,如何将其转换为Java对象 我可以通过将JSON转换为映射来提取主体值,但我不知道应该如何继续 input.json file { "body": "{\n\t\"username\": \"TestUser\",\n\t\"password\": \"TestPassword\"\n}" } 用户POJO如下所示: class User { private String username;

我有下面的json,其中body键包含一个值,该值是json对象的字符串表示形式,如何将其转换为Java对象

我可以通过将JSON转换为映射来提取主体值,但我不知道应该如何继续

input.json file

{
   "body": "{\n\t\"username\": \"TestUser\",\n\t\"password\": \"TestPassword\"\n}"
}
用户POJO如下所示:

class User {
   private String username;
   private String password;

   ... getters, setters and no-arg constructor
}
我的代码看起来像这样,我需要实现converttoser函数


我已经在使用jackson java库了,非常感谢您对jackson进行此操作的任何见解。

一种方法是创建DTO和转换器。让DTO像我一样嵌套类声明jsut以节省应答空间:

@Getter @Setter
public class Input { // this level maps to the whole input.json
    @JsonDeserialize(using =  BodyDeserializer.class) // custom deserializer below
    private Body body; // this is the body-attribute in JSON
    @Getter @Setter
    public static class Body {
        private User user;
        @Getter @Setter
        public static class User {
            private String username;
            private String password;
        }            
    }
}
转换器:

public class BodyDeserializer extends JsonDeserializer<Body> {
    private ObjectMapper om = new ObjectMapper(); // this is to read the user from string
    @Override
    public Body deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        String embedded = p.readValueAs(String.class);
        Body body = new Body();
        body.setUser(om.readValue(embedded, User.class)); // here is the trick
        return body;
    }
}

这种转换以通用方式进行,唯一的缺点可能是您不喜欢创建DTO并像Input.getBody.getUser一样挖掘用户

要将JSON字符串转换为java pojo,您可以使用Jackson的ObjectMapper类来帮助您实现这一点

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.readValue(inputJson, User.class);

更多信息可以在Jackson的

中找到。试试这一次,这是一个开源Java库,用于将Java对象转换为JSON并返回。以上两条评论对这个问题没有任何帮助,我们需要从JSON中嵌入的字符串中获取对象。getBody的输出是什么?这不适用于问题的指定场景/得到以下错误,线程main中的异常com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:Unrecognized字段用户名类eshop.common.lambdautil.Lambda$User,未通过引用链在[Source:String{username:TestUser,password:TestPassword};第2行,第15列]处标记为可忽略的0已知属性:],引用链为:eshop.common.lambdautil.LambdaTest$Input[body]->eshop.common.lambdautil.Lambda$User[username]在com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.fromUnrecognizedPropertyException.java上:61@vikkyhacks你是在运行我的代码时得到的吗?如果不是,那么在没有看到反序列化代码的情况下很难判断错误。这闻起来像是您试图反序列化到不包含用户名的错误类。我尝试了这段代码,实际情况是,整个正文值被视为一个巨大的字符串。它试图找到一个与字符串{username:TestUser,password:TestPassword}@vikkyhacks匹配的构造函数,这很奇怪,对我来说就像一个魔咒。无论如何,我把反序列化器注释放在一个有点混乱的位置,把它移到字段上方,但不确定它是否重要,这两种方式都能让我工作。我正在使用jackson数据绑定,v2.10.1。哦,让我再试一次
ObjectMapper om = new ObjectMapper();
String input = "{\"body\": \"{\\n\\t\\\"username\\\": \\\"TestUser\\\",\\n\\t\\\"password\\\": \\\"TestPassword\\\"\\n}\"}";
Input r = om.readValue(input, Input.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.readValue(inputJson, User.class);