2017-10-15 68 views
0

我CSHARP類,如下所示:打字稿嵌套類,反序列化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; 
} 

我有一個打字稿類,如下所示:

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

我的API代碼如下。

API方法如下:

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

我服JSON對象asp.net核心Web API應用程序。

我無法讓我的「目標」嵌套類和它的嵌套類「目標」屬性在角度應用程序中設置。

它看起來像對象類型。我無法獲得價值。

我該如何解析它?

+1

你的意思是,該屬性沒有設置?你能否從Web-API提供API方法的代碼? – Nikolaus

+0

是的,該屬性未設置。 – Seyfullah

+0

我添加了web api方法。 – Seyfullah

回答

0

,因爲我不知道有足夠的瞭解MongoDB中,下一個嘗試: 也許列表初始化程序可以幫助:

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

我正在使用MongoDB.Driver db方法。 StrategicPlans類型中沒有包含方法。 var p = _context.StrategicPlans.Find(_ => true).ToList(); 獲取控制器類中的所有子實體。 我現在在我的問題中添加了我的MongoContext類。 – Seyfullah

+0

在你改變之後,你說,我在http:// localhost:5000/api/strategicplans上得到了同樣的迴應。 問題可以在我使用的角度嵌套類綁定? – Seyfullah

+0

你可以用瀏覽器檢查request-Body和response-Body嗎?數據庫中是否有目標? – Nikolaus