【问题标题】:C# serialize complex object of class to jsonC#将类的复杂对象序列化为json
【发布时间】:2017-11-25 18:31:44
【问题描述】:

我想将以下类的新对象转换为 json 字符串。为此,我使用 JavaScriptSerializer 和 Newtonsoft 库。但是它们的输出都是空括号( {[],[]} )!

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace My_Entity
{
    using My_Entity.Interfaces;
    using My_Entity.Abstracts;

    public class tbl_CategoryEntity : Entity<tbl_CategoryEntity>, Itbl_Category
    {
        private Int32? _CategoryID;
        private String _CategoryName;
        private Int32? _TypeID;
        private Boolean? _IsDel;
        private static readonly string _IdentityField = "CategoryID";
        private static readonly SqlDbType _IdentitySqlDbType = SqlDbType.Int;
        private readonly Dictionary<string, SqlDbType> _FieldsSqlDbType;

        public Int32? CategoryID
        {
            get { return _CategoryID; }
            set { _CategoryID = value; }
        }

        public String CategoryName
        {
            get { return _CategoryName; }
            set { _CategoryName = value; }
        }

        public Int32? TypeID
        {
            get { return _TypeID; }
            set { _TypeID = value; }
        }

        public Boolean? IsDel
        {
            get { return _IsDel; }
            set { _IsDel = value; }
        }

        public tbl_CategoryEntity()
        {
            _FieldsSqlDbType = new Dictionary<string, SqlDbType>()
            {
                { "CategoryID", SqlDbType.Int },
                { "CategoryName", SqlDbType.NVarChar },
                { "TypeID", SqlDbType.Int },
                { "IsDel", SqlDbType.Bit }
            }.Union(base._FilterFieldsSqlDbType).ToDictionary(k => k.Key, v => v.Value);
        }

        public static string GetIdentityField()
        {
            return _IdentityField;
        }

        public static SqlDbType GetIdentitySqlDbType()
        {
            return _IdentitySqlDbType;
        }

        public override SqlDbType GetSqlDbType(string PropertyName)
        {
            return _FieldsSqlDbType[PropertyName];
        }

        public override bool IsIdentity(string PropertyName)
        {
            return PropertyName.Equals(_IdentityField);
        }
    }
}

tbl_CategoryEntity a = new tbl_CategoryEntity()
{
    CategoryID = 12,
    CategoryName = "hi"
};
string json = new JavaScriptSerializer().Serialize(a);

我该如何解决?

【问题讨论】:

  • 我们可能需要查看您派生的基类。这个基础是否有可能使用字典来存储实体值?如果是这样,这可以解释为什么您在序列化数据中得到一个数组而不是您期望的属性。
  • 因为我被列出了该对象的列表,所以返回了数组。当我在对象上进行序列化时,输出为空
  • 你可能一开始就不想直接序列化实体类。

标签: c# json object serialization


【解决方案1】:

基类(实体)是:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.Sql;

namespace My_Entity.Abstracts
{
    using My_Entity.Interfaces;

    public abstract class Entity<T> : List<T>, IEntity where T : new()
    {
        private String _OrderColumn;
        private String _Order = "asc";
        private Int32? _PageIndex = 1;
        private Int32? _RowsPage = 10;
        protected readonly Dictionary<string, SqlDbType> _FilterFieldsSqlDbType;

        public String OrderColumn
        {
            get { return _OrderColumn; }
            set { _OrderColumn = value; }
        }
        public String Order
        {
            get { return _Order; }
            set { _Order = value; }
        }
        public Int32? PageIndex
        {
            get { return _PageIndex; }
            set { _PageIndex = value; }
        }
        public Int32? RowsPage
        {
            get { return _RowsPage; }
            set { _RowsPage = value; }
        }

        public Entity()
        {
            _FilterFieldsSqlDbType = new Dictionary<string, SqlDbType>()
            { 
                { "OrderColumn", SqlDbType.VarChar },
                { "Order", SqlDbType.VarChar },
                { "PageIndex", SqlDbType.Int },
                { "RowsPage", SqlDbType.Int },
            };
        }

        public abstract SqlDbType GetSqlDbType(string PropertyName);

        public abstract bool IsIdentity(string PropertyName);
    }
}

【讨论】:

    【解决方案2】:

    好的,我认为问题在于您将实体类与实体类的集合混合在一起。我试图将集合与实体分开。看看这段代码,看看它是否对你有帮助。

    namespace ConsoleApp1
    {
        using System;
        using System.Linq;
        using Newtonsoft.Json;
        using System.Data;
        using System.Collections.Generic;
    
        class Program
        {
            static void Main(string[] args)
            {
                var t = new tbl_CategoryEntity
                {
                    CategoryID = 12,
                    CategoryName = "Hi"
                };
                var collection = new tbl_CategoryEntityCollection();
                collection.Add(t);
    
                var entityJson = JsonConvert.SerializeObject(t);
                var collectionJson = JsonConvert.SerializeObject(collection);
                Console.WriteLine("Entity = \n" + entityJson);
                Console.WriteLine("Collection = \n" + collectionJson);
    
                Console.ReadKey();
            }
        }
    
        public class tbl_CategoryEntity
        {
            private Int32? _CategoryID;
            private String _CategoryName;
            private Int32? _TypeID;
            private Boolean? _IsDel;
    
            public tbl_CategoryEntity() { }
    
            public Int32? CategoryID
            {
                get { return _CategoryID; }
                set { _CategoryID = value; }
            }
    
            public String CategoryName
            {
                get { return _CategoryName; }
                set { _CategoryName = value; }
            }
    
            public Int32? TypeID
            {
                get { return _TypeID; }
                set { _TypeID = value; }
            }
    
            public Boolean? IsDel
            {
                get { return _IsDel; }
                set { _IsDel = value; }
            }
        }
    
        public abstract class EntityCollection<T> : List<T> where T : new()
        {
            private String _OrderColumn;
            private String _Order = "asc";
            private Int32? _PageIndex = 1;
            private Int32? _RowsPage = 10;
            protected readonly Dictionary<string, SqlDbType> _FilterFieldsSqlDbType;
    
            public String OrderColumn
            {
                get { return _OrderColumn; }
                set { _OrderColumn = value; }
            }
            public String Order
            {
                get { return _Order; }
                set { _Order = value; }
            }
            public Int32? PageIndex
            {
                get { return _PageIndex; }
                set { _PageIndex = value; }
            }
            public Int32? RowsPage
            {
                get { return _RowsPage; }
                set { _RowsPage = value; }
            }
    
            protected EntityCollection()
            {
                _FilterFieldsSqlDbType = new Dictionary<string, SqlDbType>()
                {
                    { "OrderColumn", SqlDbType.VarChar },
                    { "Order", SqlDbType.VarChar },
                    { "PageIndex", SqlDbType.Int },
                    { "RowsPage", SqlDbType.Int },
                };
            }
    
            public abstract SqlDbType GetSqlDbType(string PropertyName);
    
            public abstract bool IsIdentity(string PropertyName);
        }
    
        public class tbl_CategoryEntityCollection : EntityCollection<tbl_CategoryEntity>
        {
            private static readonly string _IdentityField = "CategoryID";
            private static readonly SqlDbType _IdentitySqlDbType = SqlDbType.Int;
            private readonly Dictionary<string, SqlDbType> _FieldsSqlDbType;
    
            public tbl_CategoryEntityCollection() : base()
            {
                _FieldsSqlDbType = new Dictionary<string, SqlDbType>()
            {
                { "CategoryID", SqlDbType.Int },
                { "CategoryName", SqlDbType.NVarChar },
                { "TypeID", SqlDbType.Int },
                { "IsDel", SqlDbType.Bit }
            }
                .Union(base._FilterFieldsSqlDbType).ToDictionary(k => k.Key, v => v.Value);
            }
    
            public static string GetIdentityField()
            {
                return _IdentityField;
            }
    
            public static SqlDbType GetIdentitySqlDbType()
            {
                return _IdentitySqlDbType;
            }
    
            public override SqlDbType GetSqlDbType(string PropertyName)
            {
                return _FieldsSqlDbType[PropertyName];
            }
    
            public override bool IsIdentity(string PropertyName)
            {
                return PropertyName.Equals(_IdentityField);
            }
        }
    }
    

    请注意,您的实体 'tbl_CategoryEntityrepresents a single record from the database. But, the class 'tbl_CategoryEntityCollection 的类用于表示可以保存这些记录的集合。

    希望能指引您正确的方向!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-20
      • 1970-01-01
      • 2019-04-29
      • 1970-01-01
      • 2016-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多