ArgumentError: Вам необходимо предоставить хотя бы одну проверку: if

То, что я сделал, чтобы решить это, было игнорировать сериализацию родителя и реализовать публичное свойство «Дети», которое устанавливает мою личную коллекцию ChildrenDict. Когда я добавляю детей в частный словарь, я также устанавливаю свойство Parent для каждого дочернего элемента.

Лично я не люблю загрязнять классы данных спецификациями JSON, потому что мне нравится независимый чистый сериализатор.

Сказанное так, конечное решение не использует теги JsonIgnoreAttribute и определяет:

  • частный конструктор без параметров, используемый JSON deserializer
  • частное свойство родителя (игнорируется сериализатором JSON)
  • общедоступный метод GetParent () (для вашего собственного использования)
  • публичный конструктор, принимающий родительский аргумент (для вашего собственное использование)

Можно также определить метод SetParent (), хотя в моем коде мне это совсем не нужно.

Этот код был протестирован с NewtonsoftJson сериализация & amp; DotNET 4.5.2

using System.Collections.Generic;
using System.Linq;

namespace JsonSerializableNode
{
    public class Node
    {
        private Node() { } // used for deserializing

        public Node(string name, Node parent) // used everywhere else in your code
        {
            Name = name;
            Parent = parent;
        }

        public string Name { get; set; }

        private Node Parent { get; set; }

        public Node GetParent()
        {
            return Parent;
        }

        public Node[] Children
        {
            get
            {
                return ChildrenDict.Values.ToArray();
            }

            set
            {
                ChildrenDict.Clear();
                if (value == null || value.Count <= 0) return;
                foreach (Node child in value)
                    Add(child);
            }
        }

        // One could use a typed OrderedDictionary here, since Json lists guarantee the order of the children:
        private Dictionary<string, Node> ChildrenDict { get; } = new Dictionary<string, Node>();

        public Node Add(Node child)
        {
            ChildrenDict.Add(child.Name, child);
            child.Parent = this;
            return child;
        }

        public Node Get(string name)
        {
            return ChildrenDict[name];
        }

        public bool Remove(string name)
        {
            return ChildrenDict.Remove(name);
        }
    }
}
29
задан KL-7 26 November 2011 в 22:56
поделиться