2017-10-15 77 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