如何将对象序列化为继承IList并具有其他属性的JSON格式

问题描述 投票:0回答:1

我构建了一个

IData
对象,它具有
IValues
属性,其中
IValues
继承自
IList<ValueModel>
并具有
Field
属性。

public interface IData
{
    IValues Values { get; set; }
}

// I want to keep the inheritance with IList<ValueModel> rather than having a property, so I can directly iterate through the object.
public interface IValues : IList<ValueModel>
{
    string Field { get; set; }
}

我可以使用 Newtonsoft.Json 序列化和反序列化对象,但没有

Field
值。恐怕如果没有额外的配置(转换器、绑定器等),就不可能混合属性和集合对象

有人可以分享他或她的想法吗?

有一段时间,我以为接口有问题,但意识到这些项目没有反序列化,因为我有

IsReadOnly
属性到
True

namespace Json
{
    internal class Program
    {
        private const string PATH = "..\\data.json"; // To update.

        static void Main(string[] args)
        {
            var data = new DataModel
            {
                Values = new ValuesModel
                {
                    Field = "test" // Not serialized.
                }
            };

            data.Values.Add(new ValueModel
            {
                Id = 1,
                Name = "Name1",
                Date = DateTime.Now,
                Comments = "Comment1"
            });

            data.Values.Add(new ValueModel
            {
                Id = 2,
                Name = "Name2",
                Comments = "Comment2"
            });

            var json = JsonConvert.SerializeObject(data, Formatting.Indented);
        
            File.WriteAllText(PATH, json);

            var json2 = File.ReadAllText(PATH);

            var data2 = JsonConvert.DeserializeObject<DataModel>(json2);
        }
    }

    #region Interfaces

    public interface IData
    {
        IValues Values { get; set; }
    }

    public interface IValues : IList<ValueModel>
    {
        string Field { get; set; }
    }

    #endregion

    #region Classes

    public class DataModel
    {
        public ValuesModel Values { get; set; }
    }

    public class ValuesModel : IValues
    {
        private readonly List<ValueModel> _values = new List<ValueModel>();

        [JsonProperty("fields")] // Has no effect.
        public string Field { get; set; }

        #region IList<ValueModel> Implementation

        public ValueModel this[int index]
        {
            get
            {
                return _values[index];
            }
            set
            {
                _values[index] = value;
            }
        }

        public int Count => _values.Count;

        public bool IsReadOnly => false; // Initial issue with True value where nothing where deserialized.

        public void Add(ValueModel value)
        {
            _values.Add(value);
        }

        public void Clear()
        {
            _values.Clear();
        }

        public bool Contains(ValueModel value)
        {
            return _values.Contains(value);
        }

        public void CopyTo(ValueModel[] array, int arrayIndex)
        {
            throw new NotImplementedException();
        }

        public IEnumerator<ValueModel> GetEnumerator()
        {
            return _values.GetEnumerator();
        }

        public int IndexOf(ValueModel value)
        {
            return _values.IndexOf(value);
        }

        public void Insert(int index, ValueModel value)
        {
            _values.Insert(index, value);
        }

        public bool Remove(ValueModel value)
        {
            return _values.Remove(value);
        }

        public void RemoveAt(int index)
        {
            _values.RemoveAt(index);
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return _values.GetEnumerator();
        }

        #endregion
    }

    public class ValueModel
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public DateTime Date { get; set; }
        [JsonIgnore]
        public string Comments { get; set; }
    }

    #endregion
}
c# json list serialization properties
1个回答
0
投票

尝试 .Net 提供的 JsonSerializer 类 - 方法 .Serialize

© www.soinside.com 2019 - 2024. All rights reserved.