如何将JSON中嵌入的JSON字符串转换为java对象?
我有下面的json,其中body键包含一个值,该值是json对象的字符串表示形式,如何将其转换为Java对象 我可以通过将JSON转换为映射来提取主体值,但我不知道应该如何继续如何将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;
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);