#c# #ios #json #xamarin.forms #observablecollection
#c# #iOS #json #xamarin.forms #наблюдаемая коллекция
Вопрос:
У меня есть наблюдаемая коллекция, которая содержит список продуктов, который привязан к ListView.
Однако я хочу экспортировать эту наблюдаемую коллекцию в виде файла JSON И только определенных записей, чтобы я мог отправить ее через API.
Например.
Полная наблюдаемая коллекция содержит
- Идентификатор продукта
- Название продукта
- Цена продукта
- Количество продуктов
Но я хочу извлечь файл JSON только в:
- Идентификатор продукта
- Количество продуктов
Вот мой код:
public static ObservableCollection<FBProduct> fbproducts = new ObservableCollection<FBProduct>();
Вот мой десериализатор JSON
shoppingcartjson = JsonConvert.SerializeObject(ShoppingCart.fbproducts);
Как я могу извлечь только ProductID и ProductQTY из этой ObservableCollection вот так:
"line_items": [{"product_id":79631,"quantity":1}],
Ответ №1:
Это просто, в вашем FBProduct
классе используйте атрибут JsonIgnore!
Например:
public class FBProduct
{
[JsonIgnore]
public double Name { get; set; }
.
.
Кроме того, добавьте следующий оператор using:
using Newtonsoft.Json;
Удачи!
Не стесняйтесь обращаться, если у вас есть вопросы.
Комментарии:
1. ИДЕАЛЬНО, ЭТО РАБОТАЕТ!! БОЛЬШОЕ СПАСИБО!!
Ответ №2:
Если вы хотите всегда игнорировать свойство при сериализации вашего FBProduct
, тогда продолжайте и используйте ответ FreakyAli. Я дам краткое объяснение того, как игнорировать свойства только иногда.
Иногда вы хотите игнорировать некоторые свойства, в то время как в других случаях вам нужен полный класс без игнорирования каких-либо свойств. Но, поместив [JsonIgnore]
атрибут в свойство, вы всегда будете его игнорировать, что не очень хорошо. Таким образом, вместо этого Newtonsoft предлагает способ условно игнорировать свойства, используя то, что они называют распознавателем контрактов. Вы можете реализовать свои собственные преобразователи контрактов, чтобы иметь возможность программно игнорировать свойства иногда (а также делать все остальное, что вы могли бы, используя их атрибуты).
Вот как вы могли бы реализовать распознаватель контрактов, который условно игнорирует некоторые свойства:
public class IgnorePropertyContractResolver : DefaultContractResolver
{
// Holds our information for which properties to ignore on which types
private readonly Dictionary<Type, HashSet<string>> _ignores;
public IgnorePropertyContractResolver()
{
_ignores = new Dictionary<Type, HashSet<string>>();
}
public void IgnoreProperty(Type type, params string[] propertyNames)
{
// If we don't know the type to ignore properties on, initialize the HashSet
if (_ignores.ContainsKey(type))
_ignores[type] = new HashSet<string>();
foreach (var prop in propertyNames)
_ignores[type].Add(prop);
}
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
// Create the property as normal
var property = base.CreateProperty(member, memberSerialization);
// If we're ignoring the property
if (IsIgnored(property.DeclaringType, property.PropertyName))
{
// Don't serialize and ignore
property.ShouldSerialize = i => false;
property.Ignored = true;
}
return property;
}
private bool IsIgnored(Type type, string propertyName)
{
// If we're not ignoring any property on the type, return false
if (!_ignores.ContainsKey(type))
return false;
// If we are ignoring some properties on the type, return if we're ignoring the given property
return _ignores[type].Contains(propertyName);
}
}
Затем мы используем этот пользовательский преобразователь контрактов следующим образом:
var fbProduct = new FBProduct();
var resolver = new IgnorePropertyContractResolver();
resolver.IgnoreProperty(typeof(FBProduct),
nameof(FBProduct.ProductID),
nameof(FBProduct.Name),
nameof(FBProduct.Price),
nameof(FBProduct.Qty)
);
var serialized = JsonConvert.SerializeObject(
fbProduct,
Formatting.None, // You can choose any formatting you want
new JsonSerializerSettings
{
ContractResolver = resolver
}
);
Комментарии:
1. Огромное спасибо @MindSwipe! Я согласен, атрибут JsonIgnore будет бесконечно игнорировать переменную, которая создает проблему, если ее необходимо извлечь. Я буду делать будущие улучшения и добавлю ваш код в следующую функцию. Еще раз спасибо!!
2. Спасибо @MindSwipe, я только что поддержал ваш ответ, это чистое золото 🙂