我正在使用ServiceStack将JSON数据提供给客户端。我已经设置了BreezeJS来映射ServiceStack调用。 Web服务返回的数据格式如下:
Meta: {Path:[{"Name":"Root","Id":"00000000000000000000000000000000"}], Duration:145}
Duration: "145"
Path: "[{"Name":"Root","Id":"00000000000000000000000000000000"}]"
Offset: 0
Results: [,…]
0: {Description:SLO, InternalKey:SLO, IsActive:true, Name:SLO, ParentId:00000000000000000000000000000000,…}
ChildCount: 2
CreatedById: "ed85f2b9c0bf46729cbb17cee25e3287"
CreatedDate: "2014-09-06T06:23:16.6000000"
Description: "SLO"
HasChildren: true
Id: "9b636028e3f04535a5147a2df375adaa"
InstanceType: "Container"
InternalKey: "SLO"
IsActive: true
ModifiedDate: "2014-09-17T11:04:23.1553432"
Name: "SLO"
ParentId: "00000000000000000000000000000000"
Total: 1
如果我手动为节点“Result”创建实体,则数据会被映射,我可以在我的视图中读取它。 实体定义:
define(function (require) {
var breeze = require('breeze');
var ctor = function () {
var self = this;
self.DT = breeze.DataType;
};
ctor.prototype.instanceCreate = function (nameSpace) {
var self = this;
return self.instance = {
shortName: "instances",
namespace: nameSpace,
autoGeneratedKeyType: breeze.AutoGeneratedKeyType.Identity,
defaultResourceName: "instances",
dataProperties: {
ConnectionString: { dataType: self.String },
Description: { dataType: self.String },
InternalKey: { dataType: self.String },
IsActive: { dataType: self.Boolean },
Name: { dataType: self.String },
ParentId: { dataType: self.Int32 },
InstanceType: { dataType: self.String },
ChildCount: { dataType: self.Int32 },
HasChildren: { dataType: self.Boolean },
Uid: { dataType: self.Guid },
ETag: { dataType: self.String },
Id: { dataType: self.Int32, isPartOfKey: true },
CreatedDate: { dataType: self.DateTime },
CreatedById: { dataType: self.String },
ModifiedDate: { dataType: self.DateTime },
ModifiedById: { dataType: self.String },
DeletedDate: { dataType: self.DateTime },
DeletedById: { dataType: self.Int32 },
}
};
};
return new ctor();
});
问题是:在Breeze中是否可以定义实体,这样我就可以将“结果”节点和“元素”从JSON读入单个实体定义。所以我可以访问以下数据: data.results和data.Meta?或者有没有其他方法来解决这个问题。
答案 0 :(得分:0)
我不确定我完全理解你的问题。我认为你问是否有办法将JSON映射到一个实体,通过展平一些数据和从不同节点挑选。
如果是这样,答案是......绝对的。您需要创建一个自定义JsonResultsAdapter
,可能还有一个自定义DataServiceAdapter
(它有自己的JsonResultsAdapter
,用于处理服务器对诸如新实例之类的保存的响应。
您可以在breeze.js本身和各种Breeze Labs中找到两个适配器的示例。
我希望我能为您指出文档和编写这些适配器的指南。这是我们的积压工作。
FWIW,我不会在实体属性中找到etag
等持久性元数据。这是您需要的元数据,以使持久性工作;它不是“业务数据”,也不是应用程序开发人员应该看到或关心的东西。这就是为什么在我们的OData和SharePoint DataService适配器中,我们将这种事情移动到节点的result.extraMetadata
属性。 Breeze选择了它并将其移动到entityAspect
,这是保持持久性信息的地方(例如,改变状态)。 Breeze将entityAspect.extraMetadata
识别为属性包,您可以添加任何可以JSON.stringify的内容。