2017-10-15 2 views
0

Ich habe csharp Klasse wie folgt:Typoskript Klasse verschachtelt, Deserialisierung json

public class StrategicPlan 
{ 
    [BsonId] 
    [BsonRepresentation(BsonType.ObjectId)] 
    public string Id { get; set; } 
    public string Unit { get; set; } 
    public List<Goal> Goals { get; set; } 

    public class Goal 
    { 
     public string GoalName { get; set; } 
     public int ImplementationRatio { get; set; } 
     public List<Target> Targets { get; set; } 

     public class Target 
     { 
      public string TargetName { get; set; } 
      public int ImplementationRatio { get; set; } 
     } 
    } 

    public DateTime UpdatedOn { get; set; } = DateTime.Now; 
    public DateTime CreatedOn { get; set; } = DateTime.Now; 
    public int UserId { get; set; } = 0; 
} 

ich ein Typoskript Klasse wie folgt:

export class StrategicPlan { 
    constructor(jsonStr: string) { 
     let jsonObj: any = JSON.parse(jsonStr); 
     for (let prop in jsonObj) { 
      this[prop] = jsonObj[prop]; 
     } 
    } 
    Id: string; 
    Unit: string; 
    Goals: [ 
     { 
      GoalName: string, 
      ImplementationRatio: number, 
      Targets: [ 
       { 
        TargetName: string; 
        ImplementationRatio: number; 
       } 
      ] 
     }]; 
    UpdatedOn: Date; 
    CreatedOn: Date; 
    UserId: number; 
} 

Meine Api-Codes sind wie folgt.

Api Methoden sind wie folgt:

public interface IRepository<T> 
    { 
     Task<IEnumerable<T>> GetAll(); 
     Task<T> Get(string id); 
     Task Add(T item); 
     Task<DeleteResult> Remove(string id); 
     //Task<UpdateResult> Update(string id, string body); 
     Task<UpdateResult> Update(string id, T item); 

     //// demo interface - full document update 
     //Task<ReplaceOneResult> UpdateDocument(ObjectId id, string body); 

     // should be used with high cautious, only in relation with demo setup 
     Task<DeleteResult> RemoveAll(); 
    } 

[Route("api/[controller]")] 
     public class StrategicPlansController : Controller 
     { 
      private readonly IRepository<StrategicPlan> _repository; 

      public StrategicPlansController(IRepository<StrategicPlan> repository) 
      { 
       _repository = repository; 
      } 

      // GET: api/StrategicPlan 
      [HttpGet] 
      public Task<string> Get() 
      { 
       return GetInternal(); 
      } 

      private async Task<string> GetInternal() 
      { 
       var items = await _repository.GetAll(); 
       return JsonConvert.SerializeObject(items); 
      } 
    } 

    public class StrategicPlanRepository : IRepository<StrategicPlan> 
    { 
     private readonly MongoContext _context = null; 

     public StrategicPlanRepository(IOptions<Settings> settings) 
     { 
      _context = new MongoContext(settings); 
     } 

     public async Task<IEnumerable<StrategicPlan>> GetAll() 
     { 
      try 
      { 
       return await _context.StrategicPlans.Find(_ => true).ToListAsync(); 
      } 
      catch (Exception ex) 
      { 
       // log or manage the exception 
       throw ex; 
      } 
     } 

}

public class MongoContext 
{ 
    private readonly IMongoDatabase _database = null; 

    public MongoContext(IOptions<Settings> settings) 
    { 
     var client = new MongoClient(settings.Value.ConnectionString); 
     if (client != null) 
      _database = client.GetDatabase(settings.Value.Database); 
    } 

    public IMongoCollection<StrategicPlan> StrategicPlans 
    { 
     get { return _database.GetCollection<StrategicPlan>("StrategicPlans"); } 
    } 
} 

Ich habe eine asp.net Kern Web-API-Anwendung JSON-Objekte dienen.

Ich kann meine verschachtelte Klasse "Ziele" nicht bekommen, und ihre geschachtelte Klasse "Targets" -Eigenschaft wird in eckige Anwendung gesetzt.

Es scheint als Objekttyp. Ich kann keine Werte bekommen.

Wie kann ich es analysieren?

+1

Sie meinen, wird die Eigenschaft nicht festgelegt? Kannst du bitte den Code der API-Methode von deiner Web-API zur Verfügung stellen? – Nikolaus

+0

Ja, die Eigenschaft ist nicht festgelegt. – Seyfullah

+0

Ich habe Web API Methoden hinzugefügt. – Seyfullah

Antwort

0

Da ich nicht genug über MongoDB, nächsten Versuch wusste: Vielleicht helfen ein List-Initializer könnte:

public class StrategicPlan 
{ 
    [BsonId] 
    [BsonRepresentation(BsonType.ObjectId)] 
    public string Id { get; set; } 
    public string Unit { get; set; } 
    public List<Goal> Goals { get; set; } = new List<Goal>(); 

    public class Goal 
    { 
     public string GoalName { get; set; } 
     public int ImplementationRatio { get; set; } 
     public List<Target> Targets { get; set; } = new List<Target>(); 

     public class Target 
     { 
      public string TargetName { get; set; } 
      public int ImplementationRatio { get; set; } 
     } 
    } 

    public DateTime UpdatedOn { get; set; } = DateTime.Now; 
    public DateTime CreatedOn { get; set; } = DateTime.Now; 
    public int UserId { get; set; } = 0; 
} 
+0

Ich verwende MongoDB.Driver db Methoden. Es gibt keine include-Methode für die StrategicPlans-Eigenschaft des Typs. var p = _context.StrategicPlans.Find (_ => true) .ToList(); ruft alle Unterentitäten in der Controller-Klasse ab. Ich habe jetzt meine MongoContext-Klasse in meine Frage aufgenommen. – Seyfullah

+0

Nachdem Sie die Änderung vorgenommen haben, die Sie angegeben haben, erhalte ich die gleiche Antwort unter http: // localhost: 5000/api/strategicplans. Kann das Problem in der eckigen verschachtelten Klassenbindung sein, die ich verwendete? – Seyfullah

+0

Können Sie den Anfrage-Body und den Response-Body mit Ihrem Browser einsehen? Gibt es überhaupt ein Ziel in der Datenbank? – Nikolaus