Я пытаюсь объединить два объекта 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
, но ни один из них не работает. Кто-нибудь сталкивался с этой проблемой?