2017-06-22 5 views
1

Ich möchte neues Objekt der folgenden Klasse in JSON String konvertieren. Dazu benutze ich entweder JavaScriptSerializer und Newtonsoft library. aber die Ausgabe für beide von ihnen ist leere Klammern ({[], []})!C# serialisieren komplexes Objekt der Klasse zu 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); 

wie kann ich es beheben?

+0

Möglicherweise müssen wir die Basisklasse sehen, von der Sie abgeleitet sind. Ist es möglich, dass diese Basis ein Wörterbuch verwendet, um die Entity-Werte zu speichern? Wenn dies der Fall ist, könnte das erklären, warum Sie anstelle der erwarteten Eigenschaften ein Array in den serialisierten Daten erhalten. –

+0

wegen ich wurde eine Liste dieses Objekts erstellt, Array zurückgegeben. Wenn ich sogar auf Objekt serialisieren, ist die Ausgabe leer – Masoud

+0

Wahrscheinlich möchten Sie nicht zuerst Entitätsklassen direkt serialisieren. – Casey

Antwort

0

die Basisklasse (Entity) ist:

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

Okay, ich denke, das Problem ist, dass Sie zusammen mit der Sammlung von Entitäten Klasse der Entity-Klasse gemischt haben. Ich habe versucht, die Sammlung von der Entität zu trennen. Schau dir diesen Code an und schau, ob es dir hilft.

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

Beachten Sie, dass die Klasse für Ihr Unternehmen ‚tbl_CategoryEntity represents a single record from the database. But, the class 'tbl_CategoryEntityCollection verwendet, um eine Sammlung zu repräsentieren, die die Datensätze aufnehmen kann.

Hoffe, dass Sie in die richtige Richtung weist!

Verwandte Themen