Объединение массивов объектов приводит к дублированию с помощью Newtonsoft - PullRequest
1 голос
/ 03 апреля 2020

Я пытаюсь объединить два объекта JO с помощью Newtonsoft.

Вот модели.

    public class Users
    {
        public int userId { get; set; }
        public string name { get; set; }

        public List<Role> roles { get; set; }
    }

    public class Role
    {
        public int roleId { get; set; }
        public string role { get; set; }
    }

Я создал пользовательский объект с некоторыми примерами данных, как показано ниже:

//create a sample user
Users user = new Users()
{
    userId = 1,
    name = "Harsh",
    roles = new List<Role>()
    {
        new Role()
        {
            roleId = 1,
            role = "Admin"
        },
        new Role()
        {
            roleId = 2,
            role = "Guest"
        },
        new Role()
        {
            roleId = 3,
            role = "OpUser"
        }
    }
};

//try to update role 3 to PartsUser and add a new role 4 - Manager
var userUpdate = new Users()
{
    userId = 1,
    roles = new List<Role>() 
    {
        new Role()
        {
            roleId = 3,
            role = "PartsUser"
        },
        new Role()
        {
            roleId = 4,
            role = "Manager"
        }
    }
};

Теперь я пытаюсь объединить объект userUpdate с user.

JObject dest = JObject.Parse(JsonConvert.SerializeObject(user));

JObject source = JObject.Parse(JsonConvert.SerializeObject(userUpdate));

dest.Merge(source, new JsonMergeSettings() { MergeArrayHandling = MergeArrayHandling.Union });

Я ожидал, что пользовательский объект с ролью 3 будет изменен на PartsUser и добавлена ​​новая роль 4 для объекта. user.

Однако код приводит к следующему:

{
    "userId": 1,
    "name": "Harsh",
    "roles": [
        {
            "roleId": 1,
            "role": "Admin"
        },
        {
            "roleId": 2,
            "role": "Guest"
        },
        {
            "roleId": 3,
            "role": "OpUser"
        },
        {
            "roleId": 3,
            "role": "PartsUser"
        },
        {
            "roleId": 4,
            "role": "Manager"
        }
    ]
}

Я хочу избежать дублирования роли 3, но, похоже, не могу найти способ сделать это. Я пробовал другие варианты MergeArrayHandling, но ни один из них не работает. Кто-нибудь сталкивался с этой проблемой?

...