Javascript 如何在JSON模型中获取单个JSON对象?

Javascript 如何在JSON模型中获取单个JSON对象?,javascript,sapui5,sap-fiori,Javascript,Sapui5,Sap Fiori,我在manifest.json中定义了一个默认模型: "dataSources": { "mainService": { "uri": "/.../vehicleCollection", "type": "JSON" } }, 然后通过以下方式获取sap.ui.model.json.JSONModel: var model = oView.getModel(); var

我在manifest.json中定义了一个默认模型:

"dataSources": {            
        "mainService": {
            "uri": "/.../vehicleCollection",
            "type": "JSON"
        }
    },
然后通过以下方式获取sap.ui.model.json.JSONModel:

 var model = oView.getModel();    
 var oObject = model.getJSON("/VEHICLES(0001)");
我想要的是一个vehicleId为0001的VEHICLES,它以字符串形式返回整个VEHICLES数组:

oObject=“{”vehicleId:“{”0001”,“route:“…}{”vehicleId:“0005”,“route:“…}…”

我想知道是否有任何方便的方法来获取单个数据对象?我正在尝试将这些数据绑定到主详细信息模板中的详细信息页面

参考:

==更新====

JSON结构 (来自
model.oData
的结果和从
“/…/vehicleCollection”获取的数据,
):

{“车辆”:[
{
“车辆ID”:“0001”,
“路线”:“…”,
...
},
{“vehicleId”:“0005”,
“路线:……”,
...
}]
}

==更新=====

我想和大家分享一下我的解决方法(放在这里可以吗?),我承认这很难看,所以我希望通过使用UI5API使它更优雅

Master.controller.js

_onBindingChange : function () {
var oView = this.getView(),
    oElementBinding = oView.getElementBinding(),
    oViewModel = this.getModel("detailView"),
    sPath = oElementBinding.getPath(),
    oResourceBundle = this.getResourceBundle(),
    ObjectId = sPath.match(/'(.*?)'/)[1],

var JSONObject = oView.getModel().getJSON();

JSONObject = JSON.parse(JSONObject);

function getObjects(obj, key, val) {
    var objects = [];
    for (var i in obj) {
        if (!obj.hasOwnProperty(i)) continue;
        if (typeof obj[i] == 'object') {
            objects = objects.concat(getObjects(obj[i], key, val));
        } else if (i == key && obj[key] == val) {
            objects.push(obj);
        }
    }
    return objects;
}

var oneVehicle = getObjects(JSONObject, "vehicleId", ObjectId);

oViewModel.setProperty("/route", oneVehicle[0]['route']);
},
\u显示详细信息:功能(oItem){
var bReplace=!Device.system.phone;
这个.getRouter().navTo(“对象”{
objectId:oItem.getBindingContext().getProperty(“车辆ID”)
},布雷莱斯);
},

Detail.controller.js

_onBindingChange : function () {
var oView = this.getView(),
    oElementBinding = oView.getElementBinding(),
    oViewModel = this.getModel("detailView"),
    sPath = oElementBinding.getPath(),
    oResourceBundle = this.getResourceBundle(),
    ObjectId = sPath.match(/'(.*?)'/)[1],

var JSONObject = oView.getModel().getJSON();

JSONObject = JSON.parse(JSONObject);

function getObjects(obj, key, val) {
    var objects = [];
    for (var i in obj) {
        if (!obj.hasOwnProperty(i)) continue;
        if (typeof obj[i] == 'object') {
            objects = objects.concat(getObjects(obj[i], key, val));
        } else if (i == key && obj[key] == val) {
            objects.push(obj);
        }
    }
    return objects;
}

var oneVehicle = getObjects(JSONObject, "vehicleId", ObjectId);

oViewModel.setProperty("/route", oneVehicle[0]['route']);
},
Detail.view.xml

<ObjectStatus text="{detailView>/route}"/>

model.getData()
将获取对象。一旦获取对象,您可以使用键,即
model.getData().VEHICLES
,该键将为您提供数组中的值,以便访问第三个元素
model.getData().VEHICLES[3]

所以你的答案是:

model.getData().VEHICLES[3].vehicleId ;

注意:这是您的json的一些假设,但是如果您可以执行console.log(model.getData())或放置json.stringify(model.getData())将您的json结构粘贴到问题中,让我们知道您想要访问哪个特定元素比较容易。

建议的解决方案可行,但不包含最佳实践,我强烈建议不要开始这样编写代码。您应该始终使用
getProperty
访问模型数据。在您的示例中,您可以进入车辆我想:

var vehicleId = model.getProperty("/VEHICLES/3/vehicleId");
如果您需要整辆车,请使用:

var vehicle = model.getProperty("/VEHICLES/3");

你能试试吗:
var-oData=model.getProperty(“/VEHICLES(0001)”).getObject();console.log(oData);
@Rahul-Bhardwaj
model.getProperty(“/VEHICLES(0001)”)
返回了未定义的内容。你能粘贴你的车辆集合和
console.log(model.getData())
?我不知道为什么我会投反对票,有什么我应该修正的吗?请检查这些问题的修改。有很多理由投反对票。标题是误导性的。问题缺少必要的细节,这些细节是在收到答案后添加的。看起来自动回复器没有RTFM…如果有人投了反对票,请我想解释一下原因。@matbtt好的,投你一票,但我认为我的解决方案不值得投反对票:)。另外,如果你能在你的答案中加入更有效的方法,那就太好了。正如前面提到的,你的解决方案是有效的,这不是重点。但它不鼓励你把事情做好。你可以用锤子把钉子钉在墙上r、 但它也适用于任何硬对象……但锤子将是最聪明的解决方案。您的答案可能不是最佳实践,但它提供了一种深入研究模型的方法,谢谢。您的答案不是基于vehicleId而是基于列表中的位置获取vehicle对象。对吗?可能是某种xpath查询将工作/车辆/[车辆ID.=0001]也许?是的,@VanquishedWombat这正是我想要的!因为该应用程序是一个主控详细信息页面,我发现详细信息页面中的模板不起作用,我知道在主控页面中单击的对象的vehicleId,但不确定我是否可以获得位置。@Tina要检查-您这样做是为了在详细信息视图中访问选定的车辆详细信息吗roller?如果是,则无需根据id“查找”车辆-而是从视图中获取绑定上下文,该视图是车辆上的把手,您可以通过getProperty()访问所有属性。我对一个类似的请求感兴趣,因为我必须延迟加载延迟的详细信息相关数据。我的案例是针对项目>任务>时间日志,项目作为主控,任务作为详细信息,然后当选择任务时,我必须将DB时间日志数据加载到选项卡中,因此我需要任务键。@VanquishedWombat:JSONModel仅支持基于列表的dex访问。@matbtt理解。但是OP说“我想要的是一辆vehicleId为0001的车辆…”然后“我正在尝试将此数据绑定到主详细模板中的我的详细页面”…因此我要求澄清她实际需要做什么,因为她可能会让生活变得比需要的更困难,OP的问题可能会更复杂无关紧要。