2016-07-05 10 views
-1

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" 
      } 
     ] 
    } 
] 
} 

「ユーザー」フィールドは1つにする必要があります。私はオブジェクトマッパーの可視性設定でこれを試してみました:

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

しかしこれは違いがありません。私は、このようなaddBucketなどの追加のメソッドを持っているように私は、私のusers.javaファイル内の何かが問題を引き起こしているかもしれないと思う:

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

あなたはおそらく 'Users'フィールドと' users'フィールドの両方を持っています。 *フィールド名として大文字の単語を使用しないでください。BTW) – vaxquis

+0

私の開始JSONは[this](http://pastebin.com/HfS1QJx9)です。私は1人のユーザーフィールドから始めます。私が書き返した後、首都 "ユーザー"が追加されます。 JSONを読み込んで、バケット配列に要素を追加してから、ファイルに書き戻します。それが書き戻されると、新しいバージョンの複製がそこにあります。 – Pottsiex5

答えて

0
public User[] Users; 

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

Jacksonは、パブリックメンバーのユーザーを「ユーザー」として、getUsersを「ユーザー」としてシリアライズしています。あなたは非公開であるべきで、これを修正する必要があります。それはそうするのがよい習慣です

+0

これで修正されました。ありがとうございました。 – Pottsiex5

関連する問題