Jackson对象映射器未从java对象创建正确的Json字符串

Jackson对象映射器未从java对象创建正确的Json字符串,java,android,sqlite,jackson,jackson-databind,Java,Android,Sqlite,Jackson,Jackson Databind,我的密钥中没有A、B、C,我有用户id、密码等密钥。 另外,如果我打印用户类的toString,它会显示正确的内容 注意:用户对象来自sqlite数据库,我仔细检查它是否工作正常 请检查附加用户类。我使用这个类来保存sqlite值 因此,我以用户对象的形式从sqlite获取用户数据,然后使用Jackson对象映射器将用户对象转换为jsonstring 如果你能指出问题所在,那将大有帮助 目前,我正在低于jsnstring,这是错误的 {"A":1,"B

我的密钥中没有A、B、C,我有用户id、密码等密钥。 另外,如果我打印用户类的toString,它会显示正确的内容

注意:用户对象来自sqlite数据库,我仔细检查它是否工作正常

请检查附加用户类。我使用这个类来保存sqlite值

因此,我以用户对象的形式从sqlite获取用户数据,然后使用Jackson对象映射器将用户对象转换为jsonstring

如果你能指出问题所在,那将大有帮助

目前,我正在低于jsnstring,这是错误的

 

    {"A":1,"B":1,"C":1,"D":1,"E":1,"F":1,"G":0,"H":"ef","I":"","J":0,"K":30,"L":"","M":1,"N":0,"O":1,"P":0,"Q":"","R":"","S":1,"T":"","U":1,"V":"fkGinMCh02k:APA91bH1I8Hv1EIGdkRtZiqjvsMY-ixk_crcNxSQ3gQ1PuAOoQ0B4qllstCdOw43nZQ90JiqTpcfCyQ-_y6RsxnWcjg0gojqZ8pv4Fia_9mW4-De7nPQF4C5XIF16V5","W":"","X":0,"Y":"1","Z":"1,2,3,4,5,6,7,9,16","a":91316,"b":"email@gmail.com","c":"","d":"im","e":"F","f":"","g":1,"h":1,"i":1,"j":2478,"k":492372,"l":0,"m":10,"n":0,"o":"","p":0,"q":0,"r":0,"s":91316,"t":1,"u":1,"v":1,"w":1,"x":1,"y":0,"z":0}

预期的jsonstring

{"user_id":1,"first_name":"test","last_name":"test"}
当我从java对象转换时,我在jsonstring中得到的是“key”,而不是实际的key

我的实际密钥类似于用户id、电子邮件等

private String getUserObjectString() {
        String jsonStr = "";
        User user = here I am getting actual object content;
        ObjectMapper mapper = new ObjectMapper();
        try {
             jsonStr = mapper.writeValueAsString(user);
        } catch (JsonProcessingException e) {
            Log.i("Exception","1");
            e.printStackTrace();
        }
        return jsonStr;
    }

这是toString()的输出


您的
用户
POJO应正确注释:

  • 所有私有字段都应该用
    @JsonProperty(“JSON中元素的键”)
    注释(例如
    @JsonProperty(“userId”)
    字段
    私有int userId
  • 构造函数应该有注释
    @JsonCreator
    ,告诉Jackson在构建对象时应该使用该构造函数
  • 在构造函数中传递的所有参数都应该用
    @JsonProperty(name=“元素的键”,required=true/false)注释
  • getter应该遵守Java约定
    getElement()
    ——您可以使用IDE自动创建它们
  • 正确注释POJO后,您可以:

  • 使用以下命令从JSON字符串创建Java对象:
    objectMapper.valueToTree(jsonString,User.class)
  • 使用
    objectMapper.writeValueAsString(User)
    创建现有
    用户
    实例的JSON表示
  • 注意:注释不是“强制性”的,但强烈建议您使用。如果您不注释字段和构造函数/getter,Jackson将不得不猜测。进行库猜测从来都不好,最好是显式的,以便您可以根据需要命名属性,或者可能是错误的,而不会产生副作用


    总而言之:

    public class User {
    
        @JsonProperty("userId") // <- note: the literal value here should be exactly what you see in your Json (case included)
        public int userid;
        @JsonProperty("email")
        public String email;
        @JsonProperty("updateEmail")
        public String updatedemail;
        @JsonProperty("firstName")
        public String firstname;
        @JsonProperty("lastName")
        public String lastname;
    
        @JsonCreator
        public User(
                @JsonProperty(name = "userId", required = true) int userid,
                @JsonProperty(name = "email", required = true) String email,
                @JsonProperty(name = "updateEmail", required = true) String updatedemail,
                @JsonProperty(name = "firstName", required = true) String firstname,
                @JsonProperty(name = "lastName", required = true) String lastname
        ) {
            this.userid = userid;
            this.email = email;
            this.updatedemail = updatedemail;
            this.firstname = firstname;
            this.lastname = lastname;
        }
    
        public int getUserid() {
            return userid;
        }
    
        public String getEmail() {
            return email;
        }
    
        public String getUpdatedemail() {
            return updatedemail;
        }
    
        public String getFirstname() {
            return firstname;
        }
    
        public String getLastname() {
            return lastname;
        }
    }
    
    公共类用户{
    
    @JsonProperty(“userId”)//不确定这是否是问题的原因,但getter和setter的命名已关闭。要让jackson使用访问器工作,getter和setter必须严格遵守bean命名约定:
    getAttributeName
    (其中,
    attributeName
    是对应属性的名称。
    get
    之后的第一个字母始终大写。此外,属性应设置为
    private
    ,而不是
    public
    ).@Turing85是的,但那将是在我们创建json到java对象时发生的,但在这里我将java对象转换为jsonstring。两种方式(序列化和反序列化)都使用bean约定。@Turing85好的,让我试试完美名称和私有修饰符,然后再回复您。谢谢
    User{userid=91316, email='vasimflutter2@gmail.com', updatedemail='', firstname='Vasim', lastname='Flutter2'}
    
    public class User {
    
        @JsonProperty("userId") // <- note: the literal value here should be exactly what you see in your Json (case included)
        public int userid;
        @JsonProperty("email")
        public String email;
        @JsonProperty("updateEmail")
        public String updatedemail;
        @JsonProperty("firstName")
        public String firstname;
        @JsonProperty("lastName")
        public String lastname;
    
        @JsonCreator
        public User(
                @JsonProperty(name = "userId", required = true) int userid,
                @JsonProperty(name = "email", required = true) String email,
                @JsonProperty(name = "updateEmail", required = true) String updatedemail,
                @JsonProperty(name = "firstName", required = true) String firstname,
                @JsonProperty(name = "lastName", required = true) String lastname
        ) {
            this.userid = userid;
            this.email = email;
            this.updatedemail = updatedemail;
            this.firstname = firstname;
            this.lastname = lastname;
        }
    
        public int getUserid() {
            return userid;
        }
    
        public String getEmail() {
            return email;
        }
    
        public String getUpdatedemail() {
            return updatedemail;
        }
    
        public String getFirstname() {
            return firstname;
        }
    
        public String getLastname() {
            return lastname;
        }
    }