Jackson 对象映射器未从 java 对象创建正确的 Json 字符串
Jackson object mapper not creating proper Json string from java object
我的密钥中没有 A、B、C 我有 user_id、密码等密钥。
另外,如果我打印 toString of User class 它会显示正确的内容。
注意:用户对象来自 sqlite 数据库,我仔细检查它工作正常。
请同时检查附加用户 class。我用这个 class 来保存 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 中得到 abcd“key”而不是实际的密钥。
我的实际密钥是 user_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;
}
public class User {
public int userid;
public String email;
public String updatedemail;
public String firstname;
public String lastname;
// Empty constructor
public User() {
}
// constructor
public User(int userid, String email, String updatedemail, String firstname, String lastname){
this.userid = userid;
this.email = email;
this.updatedemail = updatedemail;
this.firstname = firstname;
this.lastname = lastname;
}
public int getID() {
return this.userid;
}
public void setID(int userid) {
this.userid = userid;
}
public String getemail() {
return this.email;
}
public String getfirstname() {
return this.firstname;
}
public String getlastname() {
return this.lastname;
}
public void setFirstName(String firstname) {
this.firstname = firstname;
}
public void setLastName(String lastname) {
this.lastname = lastname;
}
public void setEmail(String email) {
this.email = email;
}
public String getNewemail() {
return this.updatedemail;
}
public void setNewemail(String newemail) {
this.updatedemail = newemail;
}
@Override
public String toString() {
return "User{" +
"userid=" + userid +
", email='" + email + '\'' +
", updatedemail='" + updatedemail + '\'' +
", firstname='" + firstname + '\'' +
", lastname='" + lastname + '\'' +
'}';
}
}
这是 toString() 的输出
User{userid=9116, email='flutter2@gmail.com', updatedemail='', firstname='Test', lastname='Flutter2'}
您的 User
POJO 应正确注释:
- 所有私有字段都应使用
@JsonProperty("key of your element in JSON")
注释(例如 @JsonProperty("userId")
用于字段 private int userId
;
- 构造函数应该有注释
@JsonCreator
来告诉 Jackson 在构建对象时应该使用那个构造函数
- 构造函数内部传递的所有参数都应使用
@JsonProperty(name = "the key of your element", required = true/false)
注释
- 吸气剂应遵守 Java 约定
getElement()
- 您可以使用 IDE 自动创建它们
正确注释 POJO 后,您可以:
- 使用
objectMapper.valueToTree(jsonString, User.class)
从 JSON 字符串创建一个 Java 对象
- 使用
objectMapper.writeValueAsString(user)
. 创建现有 User user
实例的 JSON 表示
Note: the annotations are not "compulsory", but highly recommended. If you don't annotate your fields and constructors / getters, Jackson will have to guess. It's never good to make a library guess, better being explicit so you can name your properties as you want or possibly be wrong without side effects.
总结一下:
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;
}
}
我的密钥中没有 A、B、C 我有 user_id、密码等密钥。 另外,如果我打印 toString of User class 它会显示正确的内容。
注意:用户对象来自 sqlite 数据库,我仔细检查它工作正常。
请同时检查附加用户 class。我用这个 class 来保存 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 中得到 abcd“key”而不是实际的密钥。
我的实际密钥是 user_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;
}
public class User {
public int userid;
public String email;
public String updatedemail;
public String firstname;
public String lastname;
// Empty constructor
public User() {
}
// constructor
public User(int userid, String email, String updatedemail, String firstname, String lastname){
this.userid = userid;
this.email = email;
this.updatedemail = updatedemail;
this.firstname = firstname;
this.lastname = lastname;
}
public int getID() {
return this.userid;
}
public void setID(int userid) {
this.userid = userid;
}
public String getemail() {
return this.email;
}
public String getfirstname() {
return this.firstname;
}
public String getlastname() {
return this.lastname;
}
public void setFirstName(String firstname) {
this.firstname = firstname;
}
public void setLastName(String lastname) {
this.lastname = lastname;
}
public void setEmail(String email) {
this.email = email;
}
public String getNewemail() {
return this.updatedemail;
}
public void setNewemail(String newemail) {
this.updatedemail = newemail;
}
@Override
public String toString() {
return "User{" +
"userid=" + userid +
", email='" + email + '\'' +
", updatedemail='" + updatedemail + '\'' +
", firstname='" + firstname + '\'' +
", lastname='" + lastname + '\'' +
'}';
}
}
这是 toString() 的输出
User{userid=9116, email='flutter2@gmail.com', updatedemail='', firstname='Test', lastname='Flutter2'}
您的 User
POJO 应正确注释:
- 所有私有字段都应使用
@JsonProperty("key of your element in JSON")
注释(例如@JsonProperty("userId")
用于字段private int userId
; - 构造函数应该有注释
@JsonCreator
来告诉 Jackson 在构建对象时应该使用那个构造函数 - 构造函数内部传递的所有参数都应使用
@JsonProperty(name = "the key of your element", required = true/false)
注释
- 吸气剂应遵守 Java 约定
getElement()
- 您可以使用 IDE 自动创建它们
正确注释 POJO 后,您可以:
- 使用
objectMapper.valueToTree(jsonString, User.class)
从 JSON 字符串创建一个 Java 对象
- 使用
objectMapper.writeValueAsString(user)
. 创建现有
User user
实例的 JSON 表示
Note: the annotations are not "compulsory", but highly recommended. If you don't annotate your fields and constructors / getters, Jackson will have to guess. It's never good to make a library guess, better being explicit so you can name your properties as you want or possibly be wrong without side effects.
总结一下:
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;
}
}