Есть ли библиотека (предпочтительнее С#), чтобы разрешить то, что я бы назвал многоуровневым каскадным JSON?
Вот пример того, что я имею в виду: (Pseudocode/С#)
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
Подумав немного больше о требованиях, я вижу, что более сложный пример никогда не может работать так, как есть. Функция Cascading не сможет узнать, был ли, например, изменен определенный номер телефона или новый. Чтобы заставить его работать, каждый субобъект должен иметь уникальный идентификатор.