我正在使用JSON,ASP.NET,typescript/javascript和AngularJS来处理我的Web应用程序设计。
JSON数据结构 - JSON到对象 - 最佳实践
在短: 我需要一个最佳实践为通过JSON从服务器向客户端发送数据,使用在客户端的JSON字符串创建对象。
我有一个WebServerAPI项目(ASP.NET)结构如下:
- 控制器
- DataController类(REST API)
- 型号
- 一
- 类型
模型类:
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>();
}
// ...
}
的Get()的DataController类的方法返回一个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"}
},
]
正如你可以在JSON数据看到一些由于共享同一个类型。虽然这是有效的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}
},
]
所以我们得到的类型的唯一的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}
}
]
}
]
所以我想知道是否有最佳做法。反复发送相同的对象(Type)作为A中的嵌套对象似乎相当“愚蠢”。
特别是如果我将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++)中引用了很多东西。使用这种反序列化数据和创建对象的方式,根本不允许使用引用(,也许这在网络应用程序中是错误的?)。而且我也认为,产生大量无用的对象而不是每个类型的对象会浪费内存和CPU时间。
相当长的帖子,但我希望能很好地解释我的问题。
要总结一下:我需要一个最佳实践为通过JSON从服务器向客户端发送数据,使用在客户端的JSON字符串创建对象。
我通常有C#视图模型完全匹配JavaScript视图模型。我发现它使维护更容易,加快了开发时间,将来当我做出改变时,这不是什么大问题(对我来说这比保存几个字节的网络流量更重要)。如果你没有开发一个应用程序,每个字节数或传递大量数据,你不应该担心。在查看新页面时,您已经通过传递json字符串来节省大量字节,而不是重新装入整页。 –
@dhsto不幸的是我必须处理大量的数据(大约1kk对象(As))。但正如你可以在打字稿代码中看到的,我在C#和打字稿中使用了相同的类结构。 – bakunin