我正在努力使用
JSON,ASP.NET,typescript / javascript和AngularJS进行我的Web应用程序设计.
简而言之:
我需要一种最佳实践,通过JSON从服务器向客户端发送数据,使用客户端的JSON字符串创建对象.
我有一个WebServerAPI项目(ASP.NET)具有以下结构:
>控制器
> DataController(REST API)
>模型
> A.
>类型
模型类:
public class A { public property int Id {get; set;} public property string Name {get; set;} public property Type Type {get; set;} } public class Type { public property int Id {get; set;} public property string Name {get; set;} }
每个模型类的id属于数据库表(主键)中的id.
DataController结构:
public class DataController : ApiController { // ... // GET api/a public IEnumerable<A> Get() { // fetches all As from the database // the facade creates instances of A and Type as required // (if A has a 'Type' the Type will also fetched an set) return facade.GetAll<A>(); } // ... }
DataController的Get()方法返回JSON结果.
JSON结果如下所示:
[ {"Id":1,"Type": {"Id":1,"Name":"name1"} },{"Id":2,"Type": {"Id":2,"Name":"name2"} },{"Id":3,"Name":"name1"} } {"Id":4,{"Id":5,]
正如您在JSON数据中看到的,一些As共享相同的类型.虽然这是有效的JSON,但我想知道这是否是发送数据的最佳做法.
发送这样的东西不是更好:
[ {"Id":1,"TypeId": {"Id":1} },"TypeId": {"Id":2} },"TypeId": {"Id":1} } {"Id":4,]
所以我们只得到类型的Id.但是我们必须要求所有可用的类型来识别必须在相应的As中设置哪个类型.哪个可能不好?我认为这可能很慢,因为我必须发送两个查询.
第三个选项可能是在相同的JSON结果中发送所有可用的类型和As.
[ {"Types": [ {"Id":1,"Name":"name1"},"Name":"name2"},] },{"As": [ {"Id":1,"TypeId": {"Id":1} },"TypeId": {"Id":2} },"TypeId": {"Id":1} } {"Id":4,"TypeId": {"Id":2} } ] } ]
所以我想知道是否有最好的做法.作为A中的嵌套对象一遍又一遍地发送相同的对象(Type)似乎非常“愚蠢”.
特别是如果我将JSON字符串转换为Typescript对象.
没有任何“存储/缓存”逻辑,我一遍又一遍地创建“相同”的对象:
export class A { public Id: number; public Name: string; public Type: Type; public static fromData(data: any): A { var a = new A(); a.Id = data.Id; a.Name = data.Name; a.Type = Type.fromData(data.Type); return a; } } export class Type { public Id: number; public Name: string; public static fromData(data: any) : Type { var type = new Type(); type.Id = data.Id; type.Name = data.Name; return type; } } // AngularJS controller export class AListCtrl { static $inject = ['$scope','$http']; public As: A[] = []; constructor(private $scope,private $http) { $scope.AListCtrl = this; $http.get('http://localhost/api/a').success((data) => { var as: A[] = []; for (var i = 0; i < data.length; i++) { var aData = data[i]; var a = A.fromData(aData); as.push(a); } this.As = as; }); } }
创建表示相同类型的不同对象似乎是错误的.因为我在其他语言(C#,Java,C)中使用引用很多.使用这种反序列化数据和创建对象的方式根本不允许使用引用(可能这在Web应用程序中是错误的?).我还认为,生成大量无用的对象而不是每种类型的对象是浪费内存和cpu时间.
相当长的帖子,但我希望它能很好地解释我的问题.
总结一下:我需要一种最佳实践,使用客户端的JSON字符串创建对象.
@R_404_323@
我认为您需要定义对您的客户端应用程序最有意义的JSON表示,然后确保以该格式发送数据.我会创建一个自定义序列化器,使用内置的
JavaScriptConverter或可能是
Json.Net提供的序列化器.只是使用内置的序列化器似乎没有给出理想的结果.