Есть ли библиотека (предпочтительно C #) для разрешения того, что я бы назвал многоуровневым каскадным JSON?
Вот пример того, что я имею в виду: (псевдокод / C #)
var json1 = @"{
""firstName"": ""John"",
""lastName"": ""Smith""
}";
var json2 = @"{
""firstName"": ""Albert""
}";
var json3 = @"{
""phone"": ""12345""
}";
var cascadingJSON = JSON.Cascade(json1, json2, json3);
Результат (Такое же поведение, как у CSS)
{
"firstName"": "Albert", /*Overridden*/
"lastName"": "Smith", /*Inherited*/
"phone"": "12345" }"; /*Added*/
}
Редактировать 1 - Более сложный пример
const string json1 =
@"{
""firstName"": ""John"",
""lastName"": ""Smith"",
""age"": 25,
""address"":
{
""streetAddress"": ""21 2nd Street"",
""city"": ""New York"",
""state"": ""NY"",
""postalCode"": ""10021""
},
""phoneNumber"":
[
{
""type"": ""home"",
""number"": ""212 555-1234""
},
{
""type"": ""fax"",
""number"": ""646 555-4567""
}
]
}";
const string json2 =
@"{
""firstName"": ""John2"",
""lastName"": ""robert"",
""age"": 25,
""address"":
{
""state"": ""FL"",
},
""phoneNumber"":
[
{
""type"": ""fax"",
""number"": ""222 222-2222""
},
{
""type"": ""iphone"",
""number"": ""111 111-1111""
}
]
}";
const string json3 =
@"{
""firstName"": ""John3"",
""father"": ""guy""
}";
const string expectedResult =
@"{
""firstName"": ""John3"",
""lastName"": ""robert"",
""age"": 25,
""father"": ""guy"",
""address"":
{
""streetAddress"": ""21 2nd Street"",
""city"": ""New York"",
""state"": ""FL"",
""postalCode"": ""10021""
},
""phoneNumber"":
[
{
""type"": ""home"",
""number"": ""212 555-1234""
},
{
""type"": ""fax"",
""number"": ""222 222-2222""
},
{
""type"": ""iphone"",
""number"": ""111 111-1111""
}
]
}";
Редактировать 2
Подумав немного больше о требованиях, я вижу, что более сложный пример никогда не сможет работать как есть. Функция каскадирования не сможет узнать, был ли, например, определенный номер телефона изменен или он новый. Чтобы это работало, у каждого подобъекта должен быть уникальный идентификатор.