相关疑难解决方法(0)

Json.net反序列化列表提供重复项

我刚开始使用Newtonsoft.Json(Json.net).在我的第一个简单测试中,我在反序列化通用列表时遇到了问题.在下面的代码示例中,我序列化了一个对象,其中包含三种类型的简单整数列表(属性,成员var和数组).

生成的json看起来很好(列表转换为json数组).但是,当我将json反序列化为相同类型的新对象时,所有列表项都是重复的,期望数组.我已经通过第二次序列化来说明了这一点.

从搜索周围,我已经读到可能有一个"私人"支持字段到解串器也填充的列表.

所以我的问题是:在下列情况下是否有(最好是简单的)避免重复项目的方法?

using System;
using System.Collections.Generic;
using Newtonsoft.Json;

namespace JsonSerializeExample
{
    public class Program
    {
        static void Main()
        {
            var data = new SomeData();
            var json = JsonConvert.SerializeObject(data);
            Console.WriteLine("First : {0}", json);
            var data2 = JsonConvert.DeserializeObject<SomeData>(json);
            var json2 = JsonConvert.SerializeObject(data2);
            Console.WriteLine("Second: {0}", json2);
        }
    }

    public class SomeData
    {
        public string SimpleField;
        public int[] IntArray;
        public IList<int> IntListProperty { get; set; }
        public IList<int> IntListMember;

        public SomeData()
        {
            SimpleField = "Some data";
            IntArray = new[] { 7, …
Run Code Online (Sandbox Code Playgroud)

c# json json.net

16
推荐指数
3
解决办法
6201
查看次数

Json.Net在列表反序列化期间调用属性getter,导致重复项

我正在使用json.net来实现winform应用程序的memento模式.我正在使用memento在失败的数据库事务上回滚对象.我得到的问题是,当反序列化纪念品时,调用getter而不是setter.让我来证明:

class MyClass
{
    public int ID { get; set; }
    public string field1 { get; set; }
    public string field2 { get; set; }

    private List<SomeObject> _someObjects;
    public List<SomeObject> SomeObjects
    {
        get
        {
            if(_someObjects == null)
            {
                _someObjects = LoadSomeObjectsFromDB();
            }
            return _someObjects;
        }
        set
        {
            _someObjects = value;
        }
    }

    private List<AnotherObject> _anotherObjects;
    public List<AnotherObject> AnotherObjects
    {
        get
        {
            if(_anotherObjects == null)
            {
                _anotherObjects= LoadAnotherObjectsFromDB();
            }
            return _anotherObjects ;
        }
        set
        {
            _anotherObjects = value;
        } …
Run Code Online (Sandbox Code Playgroud)

c# json.net winforms json-deserialization

8
推荐指数
1
解决办法
3039
查看次数

填充现有对象时在添加项目之前清除集合

我有一个对象,它有几个使用公共 getter 和私有 setter 定义的集合属性,在这种情况下,JsonConvert.PopulateObject将反序列化的项目添加到这些集合中,而现有项目保持不变。

在反序列化之前清除此类成员集合时,我需要一种行为。

我尝试在标记有该[OnDeserializing]属性的方法中手动清除集合。

这种方法的问题在于,即使 JSON 字符串中不存在集合属性,它仍然会清除集合。

当只有那些实际上在 JSON 字符串中定义的集合被清除时,我需要一种方法。那些未定义的应该保持不变。

谢谢

c# json json.net

5
推荐指数
1
解决办法
288
查看次数

标签 统计

c# ×3

json.net ×3

json ×2

json-deserialization ×1

winforms ×1