【问题标题】:JSON is duplicated when writing from object to file从对象写入文件时,JSON 重复
【发布时间】:2016-07-05 14:46:53
【问题描述】:

我正在使用 Jackson 将 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 应该使用其他可见性设置吗?

【问题讨论】:

  • 您可能同时拥有 Usersusers 字段,即您可能在某处也有 users 字段(注意那里的大写 - 你不应该使用大写单词作为字段名称顺便说一句)
  • 我的起始 JSON 是 this。我只从一个用户字段开始。我回信后添加了大写的“用户”。我读入 JSON,向 buckets 数组中添加一个元素,然后将其写回文件。当它被写回时,新版本的副本就在那里。

标签: java json jackson


【解决方案1】:
public User[] Users;

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

Jackson 将公共成员用户序列化为“用户”,getUsers 函数作为“用户”。私密的用户应该解决这个问题,这样做是一种很好的做法

【讨论】:

  • 这修复了它。谢谢。
猜你喜欢
  • 2019-11-26
  • 2013-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-26
  • 2018-04-11
  • 2017-08-15
相关资源
最近更新 更多