2017-06-22 6 views
1

次のクラスの新しいオブジェクトをjson文字列に変換したいと思います。私はJavaScriptSerializerとNewtonsoftのどちらかのライブラリを使います。両方の出力は空の括弧({[]、[]})です!クラスの複雑なオブジェクトをjsonにシリアル化します

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); 

どのように修正できますか?

+0

派生している基本クラスが必要な場合があります。このベースが辞書を使用してエンティティ値を格納することは可能でしょうか?もしそうなら、それはあなたが期待するプロパティの代わりに直列化されたデータの配列を取得する理由を説明することができます。 –

+0

私はそのオブジェクトのリストを覚えていたので、配列が返されました。オブジェクト上でもシリアル化すると出力は空になります – Masoud

+0

おそらく最初に直接エンティティクラスを直列化したくないでしょう。 – Casey

答えて

0

基底クラス(エンティティ)は、次のとおりです。

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); 
    } 
} 
0

さて、私はこの問題は、あなたがエンティティクラスのコレクションと一緒にEntityクラスを混入していることだと思います。私はエンティティからコレクションを分離しようとしました。このコードを見て、それがあなたを助けるかどうかを見てください。あなたのエンティティのtbl_CategoryEntity represents a single record from the database. But, the class 'tbl_CategoryEntityCollectionのクラスは、それらのレコードを保持することができ、コレクションを表すために使用されていることを

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); 
     } 
    } 
} 

は注意してください。

あなたが正しい方向にあなたを指し示すことを願っています!

関連する問題