2015-12-21 2 views
0

Предположим, у меня есть тело запроса JSON req1, и это привело к ответу JSON resp1, некоторые из значений ключа которого идентичны значениям в req1. Теперь предположим, что у меня есть другой запрос JSON req2, и я хочу построить ответ JSON resp2, который является дубликатом resp1, но в котором общие ключи заменяют свои значения на значения от req2.JSON распознавание образов

Какую стратегию можно использовать для решения этой проблемы?

В качестве конкретного примера предположим, что req1 это:

{"Name":"Alan"} 

И пусть это resp1:

{"output":{"Name":"Alan", "Cat": "12"}} 

Обратите внимание, что "Name":"Alan" появляется в обоих.

Если req2 это:

{"Name":"Bancorp"} 

Тогда я хотел бы создать resp2resp1 из так:

{"output":{"Name":"Bancorp", "Cat": "12"}} 

Кардинально, структуру документа о req* и resp*не известны в заранее, и единственное знание, что структура req1 и req2 аналогичны, и аналогичным образом для resp1 и resp2.

Другими словами, я ищу для гибкого распознавания образов, которые будут «учиться» из исходного req1/resp1 пары путем определения полей, которые имели место в обоих, а затем быть в состоянии реагировать на будущие req* входы путем правильные подстановки к копии resp1.

Это что-то, что уже существует? Если нет, то как это может быть реализовано в JSON.Net?

+1

Если вы десериализируете свой json в объект, сделайте все, что вам нужно, а затем, сериализуйте его снова? было бы не легче? –

ответ

0

Сначала я бы десериализовал ваши запросы на отдельные объекты. Затем вы можете использовать отражение, чтобы получить список всех свойств каждого объекта и фильтровать результаты, чтобы показывать только общие свойства.

obj.GetType().GetProperties(); 

После того, как у вас есть список свойств, которые необходимы в объекте ответа, вы можете создать новый ExpandoObject и динамически добавлять свойства и соответствующие им значения, что вам нужно.

dynamic x = new ExpandoObject(); 
x.NewProp = string.Empty; 

Как только вы закончите, вы можете сериализовать этот объект ответа на JSON.