bak*_*nin 6 javascript c# asp.net json typescript
我正在努力使用JSON,ASP.NET,typescript/javascript和AngularJS进行我的Web应用程序设计.
简而言之:
我需要一种最佳实践,通过JSON从服务器向客户端发送数据,使用客户端的JSON字符串创建对象.
我有一个WebServerAPI项目(ASP.NET)具有以下结构:
模型类:
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;}
}
Run Code Online (Sandbox Code Playgroud)
每个模型类的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>();
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
DataController的Get()方法返回JSON结果.
JSON结果如下所示:
[
{"Id":1,
"Type": {"Id":1, "Name":"name1"}
},
{"Id":2,
"Type": {"Id":2, "Name":"name2"}
},
{"Id":3,
"Type": {"Id":1, "Name":"name1"}
}
{"Id":4,
"Type": {"Id":2, "Name":"name2"}
},
{"Id":5,
"Type": {"Id":2, "Name":"name2"}
},
]
Run Code Online (Sandbox Code Playgroud)
正如您在JSON数据中看到的,一些As共享相同的类型.虽然这是有效的JSON,但我想知道这是否是发送数据的最佳做法.
发送这样的东西不是更好:
[
{"Id":1,
"TypeId": {"Id":1}
},
{"Id":2,
"TypeId": {"Id":2}
},
{"Id":3,
"TypeId": {"Id":1}
}
{"Id":4,
"TypeId": {"Id":2}
},
{"Id":5,
"TypeId": {"Id":2}
},
]
Run Code Online (Sandbox Code Playgroud)
所以我们只得到类型的Id.但是我们必须要求所有可用的类型来识别必须在相应的As中设置哪个类型.哪个可能不好?我认为这可能很慢,因为我必须发送两个查询.
第三个选项可能是在相同的JSON结果中发送所有可用的类型和As.
[
{"Types":
[
{"Id":1, "Name":"name1"},
{"Id":2, "Name":"name2"},
]
},
{"As":
[
{"Id":1,
"TypeId": {"Id":1}
},
{"Id":2,
"TypeId": {"Id":2}
},
{"Id":3,
"TypeId": {"Id":1}
}
{"Id":4,
"TypeId": {"Id":2}
},
{"Id":5,
"TypeId": {"Id":2}
}
]
}
]
Run Code Online (Sandbox Code Playgroud)
所以我想知道是否有最好的做法.作为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;
});
}
}
Run Code Online (Sandbox Code Playgroud)
创建表示相同类型的不同对象似乎是错误的.因为我在其他语言(C#,Java,C++)中使用引用很多.使用这种反序列化数据和创建对象的方式根本不允许使用引用(可能这在Web应用程序中是错误的?).我还认为,生成大量无用的对象而不是每种类型的对象是浪费内存和CPU时间.
相当长的帖子,但我希望它能很好地解释我的问题.
总结一下: 我需要一种最佳实践,通过JSON从服务器向客户端发送数据,使用客户端的JSON字符串创建对象.
我认为您需要定义对您的客户端应用程序最有意义的 JSON 表示形式,然后确保数据以该格式发送。我将创建一个自定义序列化器,使用内置的JavaScriptConverter或可能使用Json.Net提供的序列化器。仅使用内置序列化器似乎并不能给出理想的结果。
| 归档时间: |
|
| 查看次数: |
2819 次 |
| 最近记录: |