2016-07-05 54 views
-1

我正在使用Jackson将JSON转换为对象,反之亦然。但是,当将对象回写为JSON时,它会被复制,如下所示:从对象写入文件时JSON被复制

{ 
"Users": [ 
    { 
     "name": "Steve", 
     "buckets": [ 
      { 
       "bucketName": "stevesbucket", 
       "permissions": [ 
        "CREATE", 
        "READ", 
        "UPDATE", 
        "DELETE" 
       ], 
       "owner": "Steve" 
      }, 
      { 
       "bucketName": "NEW BUCKET 2", 
       "permissions": [ 
        "CREATE", 
        "READ", 
        "UPDATE", 
        "DELETE" 
       ], 
       "owner": "Steve" 
      } 
     ] 
    }, 
    { 
     "name": "Jeff", 
     "buckets": [ 
      { 
       "bucketName": "jeffsbucket", 
       "permissions": [ 
        "CREATE", 
        "READ", 
        "UPDATE", 
        "DELETE" 
       ], 
       "owner": "Jeff" 
      }, 
      { 
       "bucketName": "stevesbucket", 
       "permissions": [ 
        "READ" 
       ], 
       "owner": "Steve" 
      } 
     ] 
    } 
], 
"users": [ 
    { 
     "name": "Steve", 
     "buckets": [ 
      { 
       "bucketName": "stevesbucket", 
       "permissions": [ 
        "CREATE", 
        "READ", 
        "UPDATE", 
        "DELETE" 
       ], 
       "owner": "Steve" 
      }, 
      { 
       "bucketName": "NEW BUCKET 2", 
       "permissions": [ 
        "CREATE", 
        "READ", 
        "UPDATE", 
        "DELETE" 
       ], 
       "owner": "Steve" 
      } 
     ] 
    }, 
    { 
     "name": "Jeff", 
     "buckets": [ 
      { 
       "bucketName": "jeffsbucket", 
       "permissions": [ 
        "CREATE", 
        "READ", 
        "UPDATE", 
        "DELETE" 
       ], 
       "owner": "Jeff" 
      }, 
      { 
       "bucketName": "stevesbucket", 
       "permissions": [ 
        "READ" 
       ], 
       "owner": "Steve" 
      } 
     ] 
    } 
] 
} 

哪里应该只有一个“用户”字段。我试图用我的对象映射器的可见性设置玩这个:

ObjectMapper mapper = new ObjectMapper(); 
    mapper.getSerializationConfig().getDefaultVisibilityChecker() 
    .withFieldVisibility(JsonAutoDetect.Visibility.ANY) 
    .withGetterVisibility(JsonAutoDetect.Visibility.NONE) 
    .withSetterVisibility(JsonAutoDetect.Visibility.NONE) 
    .withCreatorVisibility(JsonAutoDetect.Visibility.NONE); 

但是这并没有区别。我认为有些事情在我users.java文件可能会导致一个问题,因为我有额外的方法如addBucket:

public static class Bucket 
{ 
    private String bucketName; 
    private String[] permissions; 
    private String owner; 

    public void setBucket(String bucketName, String[] permissions, String owner) 
    { 
     this.bucketName = bucketName; 
     this.permissions = permissions; 
     this.owner = owner; 
    } 

    public String getBucketName() 
    { 
     return bucketName; 
    } 

    public String[] getPermissions() 
    { 
     return permissions; 
    } 

    public String getOwner() 
    { 
     return owner; 
    } 
} 

public static class User 
{ 
    private String name; 
    private Bucket[] buckets; 

    public String getName() 
    { 
     return name; 
    } 

    public Bucket[] getBuckets() 
    { 
     return buckets; 
    } 

    @JsonIgnore 
    public void addBucket(String bucketName, String[] permissions, String owner) 
    { 
     Bucket[] temp = new Bucket[buckets.length+1]; 
     for(int i = 0; i < buckets.length; ++i) 
     { 
      temp[i] = buckets[i]; 
     } 
     temp[temp.length-1] = new Bucket(); 
     temp[temp.length-1].setBucket(bucketName, permissions, owner); 
     buckets = temp; 
    } 
} 

public User[] Users; 

public User[] getUsers() 
{ 
    return Users; 
} 

public void setUsers(User[] newUsers) 
{ 
    Users = newUsers; 
} 

是否有一些属性,我需要补充一些东西users.java?或者我应该使用ObjectMapper的其他可见性设置?

+1

你可能同时拥有用户和用户字段,也就是说你可能在某处也有用户字段(注意大写字母在那里 - 你*不应该*使用大写字母作为字段名称BTW) – vaxquis

+0

我的起始JSON是[this](http://pastebin.com/HfS1QJx9)。我只从一个用户字段开始。我回写后添加大写“用户”。 我在JSON中读取数据,向数组中添加一个元素,然后将其写回文件。当它被写回时,新版本的副本就在那里。 – Pottsiex5

回答

0
public User[] Users; 

public User[] getUsers() 
{ 
    return Users; 
} 

Jackson正在将公共成员用户作为“用户”序列化,而getUsers作为“用户”发挥功能。用户是私人的应该解决这个问题,这是一个很好的做法,因为它是如此的

+0

这解决了它。谢谢。 – Pottsiex5