如何解决Xamarin表单-自定义JSON的可观察集合
我有一个可观察的集合,其中包含绑定到ListView的产品列表。
但是我想将此Observable集合导出为JSON文件,并且仅导出特定的条目,以便我可以通过API提交。
例如。
完整的可观测集合包含
- 产品ID
- 产品名称
- 产品价格
- 产品数量
但是我只想提取JSON文件:
- 产品ID
- 产品数量
这是我的代码:
public static ObservableCollection<FBProduct> fbproducts = new ObservableCollection<FBProduct>();
这是我的JSON反序列化器
shoppingcartjson = JsonConvert.SerializeObject(ShoppingCart.fbproducts);
我怎么只能像这样从ObservableCollection中仅提取ProductID和ProductQTY:
"line_items": [{"product_id":79631,"quantity":1}],
解决方法
在您的FBProduct
类中,使用JsonIgnore属性很简单!
例如:
public class FBProduct
{
[JsonIgnore]
public double Name { get; set; }
.
.
此外,添加以下using语句:
using Newtonsoft.Json;
祝你好运!
如有疑问,请随时回来。
,如果要在序列化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
}
);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。