У меня следующий JSON-объект, возвращенный из JSON, отличается:
{
"lastName": ["Bab", "Beb"],
"middleName": ["Cg", "seeg"],
"contact":
{
"emailAddress": ["bab@example.com", "beb@example.com"],
"addresses":
[
{
"state": ["AL", "AZ"]
},
{
"state": ["TN", "MO"]
}
]
}
}
Мне нужен список изменений следующим образом.
lastName/new:Bab/old:Beb
middleName/new:Cg/old:seeg
contact.emailAddress/new:bab@example.com/old:beb@example.com
contact.addresses[0].state/new:AL/old:AZ
contact.addresses[1].state/new:TN/old:MO
Итак, я написал эту уродливую программуиспользуя немного рекурсии.
private static IEnumerable<DocumentProperty> ParseJObject(JObject node)
{
HashSet<DocumentProperty> documentProperties = new HashSet<DocumentProperty>();
DocumentProperty documentProperty = new DocumentProperty();
foreach (KeyValuePair<string, JToken> sub in node)
{
if (sub.Value.Type == JTokenType.Array)
{
// unnamed nodes which contain nested objects
if (sub.Value.First.Type == JTokenType.Object)
{
foreach (var innerNode in sub.Value.Children())
{
documentProperties.UnionWith(ParseJObject((JObject)innerNode));
}
}
documentProperty = CreateDocumentProperty(sub.Value);
}
else if (sub.Value.Type == JTokenType.Object)
{
documentProperties.UnionWith(ParseJObject((JObject)sub.Value));
}
documentProperties.Add(documentProperty);
}
return documentProperties;
}
Это сработало, за исключением того, что оно дает мне дополнительный вывод.
lastName/new:Bab/old:Beb
middleName/new:Cg/old:seeg
contact.emailAddress/new:bab@example.com/old:beb@example.com
contact.addresses[0].state/new:AL/old:AZ
contact.addresses[1].state/new:TN/old:MO
contact.addresses/new:{ <-----------------------------Extra here.
"state": [
"AL",
"AZ"
]
}/old:{
"state": [
"TN",
"MO"
]
}
Я подозреваю, что это связано с тем, как у меня настроена рекурсия. Можете ли вы сразу понять, что здесь не так?
Определение для CreateDocumentProperty
private static DocumentProperty CreateDocumentProperty(JToken subValue) => new DocumentProperty()
{
PropertyName = subValue.Path,
New = subValue[0].ToString(),
Old = subValue[1].ToString()
};
Основной метод:
static void Main()
{
JToken jToken = JToken.Parse("{\"lastName\":[\"Bab\",\"Beb\"],\"middleName\":[\"Cg\",\"seeg\"],\"contact\":{\"emailAddress\":[\"bab@example.com\",\"beb@example.com\"],\"addresses\":[{\"state\":[\"AL\",\"AZ\"]},{\"state\":[\"TN\",\"MO\"]}],}}");
JObject inner = jToken.Value<JObject>();
IEnumerable<DocumentProperty> data = ParseJObject(inner);
foreach (var item in data) Console.WriteLine(item);
}