反序列化映射< String,Object>领域与Gson [英] Deserializing a Map<String, Object> field with Gson
问题描述
class User {
private String id;
私人字符串名称;
私人地图< String,Object>性能;
// GETTERS& SETTERS
}
我有这种结构的JSON字符串:
{
user:{
id:123456789,
name:azerty,
emailHash:123456789,//未在用户类中使用
properties:{
p1:1,
p2:test,
p3:[1,2,3,4],
p4:{
etc ...
}
}
}
属性的键是String,属性的值可以是一个String,int, Array,boolean,Map等。
我试图用Gson反序列化这个JSON字符串:
<$ p $ JSONParser解析器=新的JsonParser();
JsonElement元素= parser.parse(jsonString);
JsonObject object = element.getAsJsonObject();
GsonBuilder builder = new GsonBuilder();
builder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
Gson gson = builder.create();
User user =(User)gson.fromJson(object.get(user),new TypeToken< User>(){} .getType());
字段'id'和'name'被正确注入,但字段'属性'保持为空。 / p>
你知道我做错了吗?
感谢您的帮助!
对于我来说这个代码:
public class Main {
public static void main(String [] args)throws IOException {
GsonBuilder builder = new GsonBuilder();
builder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
Gson gson = builder.create();
FileInputStream inputStream = new FileInputStream(new File(bobi.json));
InputStreamReader reader = new InputStreamReader(inputStream);
User user = gson.fromJson(reader,User.class);
System.out.println(user.getName());
System.out.println(user.getId());
for(String property:user.getProperties()。keySet()){
System.out.println(Key:+ property +value:+ user.getProperties()。get属性));
}
reader.close();
$ / code $ / pre
$ b $打印此:
$ b < pre $ lt; code> azerty
123456789
键:p1值:1.0
键:p2值:test
键:p3值:[1.0,2.0 ,3.0,4.0]
键:p4值:{}
但请记住我已经剥离了我解析的文件中的包装json对象。该文件是:
{
id:123456789,
name: azerty,
emailHash:123456789,
properties:{
p1:1,
p2:test,
p3:[1,2,3,4],
p4:{
}
}
}
另外,我添加了 I have a User object with this structure: I have a JSON String with this structure: Properties' keys are String, Properties' values can be a String, int, Array, boolean, Map etc. I try to deserialize this JSON string with Gson like that: Fields 'id' and 'name' are correctly injected but the field 'properties' stays null. Do you know what I'm doing wrong?
Thanks in advance for your help! For me this code: Prints this: However, keep in mind that I have stripped the wrapping json object in the file I parse. The file is: Also I added closing double quote for The
这篇关于反序列化映射< String,Object>领域与Gson的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋! name
和 id的结尾双引号,你在样本中没有。
import java.util.Map;
class用户{
私人字符串ID;
私人字符串名称;
私人地图< String,Object>性能;
public String getId(){
return id;
}
public void setId(String id){
this.id = id;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public Map< String,Object> getProperties(){
返回属性;
}
public void setProperties(Map< String,Object> properties){
this.properties = properties;
}
}
class User {
private String id;
private String name;
private Map<String, Object> properties;
// GETTERS & SETTERS
}
{
"user": {
"id:"123456789",
"name:"azerty",
"emailHash":"123456789", // not used in User class
"properties": {
"p1":1,
"p2":"test",
"p3":[1, 2, 3, 4],
"p4":{
etc...
}
}
}
}
JsonParser parser = new JsonParser();
JsonElement element = parser.parse(jsonString);
JsonObject object = element.getAsJsonObject();
GsonBuilder builder = new GsonBuilder();
builder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
Gson gson = builder.create();
User user = (User) gson.fromJson(object.get("user"), new TypeToken<User>() {}.getType());
public class Main {
public static void main(String[] args) throws IOException {
GsonBuilder builder = new GsonBuilder();
builder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
Gson gson = builder.create();
FileInputStream inputStream = new FileInputStream(new File("bobi.json"));
InputStreamReader reader = new InputStreamReader(inputStream);
User user = gson.fromJson(reader, User.class);
System.out.println(user.getName());
System.out.println(user.getId());
for (String property : user.getProperties().keySet()) {
System.out.println("Key: " + property + " value: " + user.getProperties().get(property));
}
reader.close();
}
azerty
123456789
Key: p1 value: 1.0
Key: p2 value: test
Key: p3 value: [1.0, 2.0, 3.0, 4.0]
Key: p4 value: {}
{
"id":"123456789",
"name" : "azerty",
"emailHash":"123456789",
"properties": {
"p1":1,
"p2":"test",
"p3":[1, 2, 3, 4],
"p4":{
}
}
}
name
and id
, which you did not have in your sample.User
class as requested by the OP. I have added getters and setters for the reason of printing:import java.util.Map;
class User {
private String id;
private String name;
private Map<String, Object> properties;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Map<String, Object> getProperties() {
return properties;
}
public void setProperties(Map<String, Object> properties) {
this.properties = properties;
}
}