【问题标题】:JSON.NET cannot handle simple array deserialization?JSON.NET 不能处理简单的数组反序列化?
【发布时间】:2013-12-02 08:01:40
【问题描述】:

我创建了一个带有一个字段的简单类。 class Test{int value;}

如果我使用“保留引用”功能并将其设置为“全部”(即对象和数组),那么当我简单地序列化一个测试对象数组时,它会被序列化为带有特殊“$”的 JSON 对象values" 成员与数组值,以及预期的 "$id" 属性以保留数组引用。这很好,但整个事情又一次在反序列化时中断了。

单步浏览源代码,我发现仅仅因为“IsReadOnlyOrFixedSize”的测试为真,它就会将标志“createdFromNonDefaultConstructor”设置为真,这甚至没有任何意义,因为虽然它是固定大小的数组,它是从默认构造函数创建的,除非它认为任何固定大小的数组构造函数都是非默认构造函数。底线是它应该能够处理如此基本的事情,但它会抛出这个错误:“Cannot preserve reference to array or readonly list, or list created from a non-default constructor”。

如何反序列化基本数组,同时保留 JSON.NET 中的所有引用而不会出错?

【问题讨论】:

标签: arrays json.net deserialization strong-typing


【解决方案1】:

遇到了同样的问题,我使用List<T> 而不是T[] 来解决它。

【讨论】:

    【解决方案2】:

    您很可能错过了对ToObject(...) 的调用和类型转换。 这应该有效:

    class Test { public int Value; }
    
    class Program
    {
        static void Main(string[] args)
        {
            var array = new Test[2];
            var instance = new Test {Value = 123};
    
            array[0] = instance;
            array[1] = instance;
    
            var settings = new JsonSerializerSettings
            {
                PreserveReferencesHandling = PreserveReferencesHandling.All
            };
    
            string serialized = JsonConvert.SerializeObject(array, settings);
    
            // Explicitly call ToObject() and cast to the target type
            var deserialized = (Test[]) ((JArray)JsonConvert.DeserializeObject(serialized, settings)).ToObject(typeof(Test[]));
    
            Debug.Assert(deserialized[0].Value == 123);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多