Отфильтровать свойства из JObject
довольно просто. То, как вы это сделаете, зависит от того, что вы знаете о JSON, а что нет.
Например, предположим, что ваш класс BasicInfo
определен так:
class BasicInfo
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Amount { get; set; }
}
И ваш JSON выглядит следующим образом:
{
"good": {
"Id": 1,
"Name": "Foo",
"Amount": 14.95
},
"acceptable": {
"Id": 2,
"Name": "Bar"
},
"suspect": {
"Id": 3,
"Hmm": "Blah"
},
"bad": {
"Foo": "Bar",
"Baz": "Quux"
},
"ugly": "total garbage"
}
Если вы знаете указанные c ключи, которые вызывают проблемы, вы можете создать простой метод расширения для их фильтрации, например:
public static void FilterOutUnwantedProperties(this JObject jo, params string[] keys)
{
var unwantedProperties = jo.Properties().Where(jp => keys.Contains(jp.Name)).ToList();
foreach (JProperty prop in unwantedProperties)
{
prop.Remove();
}
}
Затем вызовите его из вашего HandleInfoReceipt
метода следующим образом:
respJson.FilterOutUnwantedProperties("bad", "ugly");
Fiddle: https://dotnetfiddle.net/TfH6Fr
С другой стороны, может быть, вы не знаете ключи заранее или они динамические c. Возможно, лучшим подходом было бы сделать так, чтобы метод расширения проверял, что каждое значение свойства в JObject фактически является самим объектом, и проверяет имена свойств объекта child , чтобы убедиться, что хотя бы одно из них (или все их?) соответствуют желаемому типу элемента. Это может выглядеть примерно так:
public static void FilterOutPropertiesThatAreNotCompatibleWith<TItem>(this JObject jo, BindingFlags flags=BindingFlags.Public|BindingFlags.Instance)
{
var knownItemPropertyNames =
typeof(TItem).GetProperties(flags)
.Select(p => p.Name);
var knownItemFieldNames =
typeof(TItem).GetFields(flags)
.Select(p => p.Name);
var knownItemMemberNames = new HashSet<string>(knownItemPropertyNames);
knownItemMemberNames.UnionWith(knownItemFieldNames);
var unwantedProperties =
jo.Properties()
.Where(jp => jp.Value.Type != JTokenType.Object ||
!jp.Value.Children<JProperty>()
.Any(cp => knownItemMemberNames.Contains(cp.Name)))
.ToList();
foreach (JProperty prop in unwantedProperties)
{
prop.Remove();
}
}
Вы бы назвали эту версию так:
respJson.FilterOutPropertiesThatAreNotCompatibleWith<BasicInfo>();
Fiddle: https://dotnetfiddle.net/WsDmCE