我有一个对象,该对象有几个用public
getter但私有setter定义的集合属性,在这种情况下,JsonConvert.PopulateObject
将反序列化的项目添加到这些集合中,而现有的项目保持不变。
在反序列化之前清除此类成员集合时,我需要采取一种行为。
我尝试使用带有[OnDeserializing]
属性的方法手动清除集合。
这种方法的问题在于,即使在JSON字符串中不存在collection属性,它仍将清除集合。
当仅清除那些在JSON字符串中实际定义的集合时,我需要一种方法。那些未定义的应该保持不变。
谢谢
好的,因此,在访问Json.NET源代码后,我通过从继承了自定义合同解析器找到了以下解决方案DefaultContractResolver
。
我需要重写数组协定创建来添加反序列化回调。此时,回调接收到具体的集合实例,因此我们可以对其进行操作(在这种情况下,将其清除)。
只要我能确定,它就可以安全使用,但是请随时警告此方法的任何缺点。
注意:我是唯一认为这应该是默认行为的人吗?
public class CollectionClearingContractResolver : DefaultContractResolver
{
protected override JsonArrayContract CreateArrayContract(Type objectType)
{
var c = base.CreateArrayContract(objectType);
c.OnDeserializingCallbacks.Add((obj, streamingContext) =>
{
var list = obj as IList;
if (list != null && !list.IsReadOnly)
list.Clear();
});
return c;
}
}
...
public class Test {
public List<int> List { get; private set; }
public Test() {
List = new List<int>();
}
}
...
var myObj = new Test();
myObj.List.AddRange(new[] {1,2,3});
var listReference = myObj.List;
JsonConvert.PopulateObject("{ List: [4, 5, 6] }", myObj,
new JsonSerializerSettings {
ContractResolver = new CollectionClearingContractResolver(),
});
myObj.List.ShouldEqual(listReference); // didn't recreate list
myObj.List.Count.ShouldEqual(3);
myObj.List.SequenceEqual(new[] { 4, 5, 6}).ShouldBeTrue();
问题内容: 我使用Json.Net这样填充一个类: 上面的结果JSON字符串填充了我的类中的几个属性。稍后我有一个新的JSON字符串,并希望使用其余属性填充相同的类。是否可以使用JSON.NET或方法?我基本上想在上面的代码行中添加/添加到我填充的帐户对象中。 我的课: 问题答案: 是的,您可以使用第二个JSON字符串来填充现有对象的属性。 这是一个例子: 输出: 小提琴:https : //do
问题内容: 我想使用css在html中的选择选项之间添加某种空间(填充,边距或其他)。我已经尝试使用类似的东西: 但是没有用。我已经读过,这是可以做到的,但在IE中不起作用。无论如何,即使它无法在IE中运行,我也希望它可以在其他浏览器中运行。 PS:当前正在使用Chrome 问题答案: 选择选项的样式非常有限,因为要在操作系统中的所有应用程序之间保持一致性和一致性,因此浏览器应限制某些基本元素的样
问题内容: 我有一个JavaScript对象,如下所示: 如果我想在此列表中添加/删除项目,我将如何使用jQuery进行处理?客户希望该列表是可动态修改的。 问题答案: 首先,您引用的代码 不是 JSON。您的代码是JavaScript对象文字表示法。JSON是为简化解析而设计的子集。 您的代码定义的对象(包含数组()对象)(每个都具有,和)。 您不需要或不需要jQuery,而只需JavaScri
作为一项任务,我被要求制作一个Swing GUI。在第一部分中,我创建了一个()对象()。目前所需要的是对所述数组列表进行排序,并将其显示为GUI中的。我制作了一个,当按下它时,它应该进行排序和显示。 但是,一旦按下它将只显示表标题而不显示数组列表中的信息,我应该做什么不同的事情呢?我已经在下面包括了GUI类和main类。
我有一个要填充信息的对象。我从许多不同的服务中检索信息。我做了一个助手类,它有一个公共方法,然后有许多私有方法来调用服务。我写的东西很好,但我不确定这是否是正确的方法。 您可能想知道为什么我需要一个包含所有这些信息的对象。我需要它全部在一个对象中,因为我从这个java对象创建了一个json对象并将其传递给javascript层。 我的方法有什么问题?我是否应该遵循一种编程范式来做这样的事情? 例子
问题内容: 根据http://www.newtonsoft.com/json/help/html/PopulateObject.htm,您可以通过JSON字符串中定义的值来更新现有实例。我的问题是,我必须填充该对象的数据已经被解析为JToken对象。我当前的方法如下所示: 是否有更好的方法来完成此任务,而不必首先还原在创建JToken时已经完成的解析? 问题答案: 使用阅读器并将其传递给。返回的阅