Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有更改键/值的JSON响应对象_Json_Angular - Fatal编程技术网

具有更改键/值的JSON响应对象

具有更改键/值的JSON响应对象,json,angular,Json,Angular,我试着浏览了很多网站,浏览了很多帖子,但仍然找不到我要找的东西,或者至少无法实现它。我有一个API响应,根据请求参数,它要么返回一个包含对象数组的对象(我可以处理),要么返回包含数组的多个对象的对象。我能够从简单的表单中获取数据,但是包含对象的多对象正在踢我的屁股。我也在Angular 4中这样做,以防万一这会有所不同。回应来自于政府 下面是不带过滤参数的完整响应,减去一些对象,以避免失败 { "status": 200, "holidays": { "2016-01-01": [ {

我试着浏览了很多网站,浏览了很多帖子,但仍然找不到我要找的东西,或者至少无法实现它。我有一个API响应,根据请求参数,它要么返回一个包含对象数组的对象(我可以处理),要么返回包含数组的多个对象的对象。我能够从简单的表单中获取数据,但是包含对象的多对象正在踢我的屁股。我也在Angular 4中这样做,以防万一这会有所不同。回应来自于政府

下面是不带过滤参数的完整响应,减去一些对象,以避免失败

{ "status": 200, "holidays": {
   "2016-01-01": [
  {
    "name": "Durin's Day",
    "date": "2016-01-01",
    "observed": "2016-01-01",
    "public": true
  }
],
"2016-02-23": [
  {
    "name": "Founder's Day",
    "date": "2016-02-23",
    "observed": "2016-02-23",
    "public": true
  }
],
"2016-02-29": [
  {
    "name": "Leap Day",
    "date": "2016-02-29",
    "observed": "2016-02-29",
    "public": false
  }
],
"2016-03-20": [
  {
    "name": "Weasel Stomping Day",
    "date": "2016-03-20",
    "observed": "2016-03-20",
    "public": false
  }
],
"2016-04-05": [
  {
    "name": "First Contact Day",
    "date": "2016-04-05",
    "observed": "2016-04-05",
    "public": false
  }
],
"2016-04-06": [
  {
    "name": "Second Contact Day",
    "date": "2016-04-06",
    "observed": "2016-04-06",
    "public": false
  }
],
"2016-05-10": [
  {
    "name": "Whacking Day",
    "date": "2016-05-10",
    "observed": "2016-05-10",
    "public": false
  }
],
"2016-10-31": [
  {
    "name": "Harry Potter Day",
    "date": "2016-10-31",
    "observed": "2016-10-31",
    "public": false
  }
],
"2016-11-24": [
  {
    "name": "Hogswatch",
    "date": "2016-11-24",
    "observed": "2016-11-24",
    "public": false
  }
],
"2016-12-23": [
  {
    "name": "Festivus",
    "date": "2016-12-23",
    "observed": "2016-12-23",
    "public": true
  }
],
"2016-12-25": [
  {
    "name": "Decemberween",
    "date": "2016-12-25",
    "observed": "2016-12-25",
    "public": false
  },
  {
    "name": "Winter Veil",
    "date": "2016-12-25",
    "observed": "2016-12-26",
    "public": true
  }
] 
} }
以下是使用的代码:

import { Component, OnInit, Input } from '@angular/core';
import { HolidayService } from '../holiday.service';
@Component({
  selector: 'app-holiday',
  templateUrl: './holiday.component.html',
  styleUrls: ['./holiday.component.css']
})
export class HolidayComponent implements OnInit {
  constructor(private _holiday: HolidayService) {     
  }
  holidaysObj: any;
  holidayArr: Array<{key: string, value: string}>;
  ngOnInit() {
  }
  holidayParams(country,month){    
  this._holiday.getHolidays(country.value,month.value)
  .subscribe(responseDa
  ta => {
      this.holidaysObj = responseData;
      console.log(responseData);
    }); 
    this.convertObj(this.holidaysObj);
  }
  convertObj(obj : any){
    for(const prop in obj){
      if(obj.hasOwnProperty(prop)){
        this.holidayArr.push(obj[prop]);
      }
    }
  }
}

您可以使用自定义管道来迭代对象,也可以从响应中提取
holidays
中的数据,如:

.map(res => res.json().holidays)
但在这里我不会这么做

因此,让我们创建自定义管道:

@管道({
名称:“钥匙”
})
导出类keypipe实现PipeTransform{
转换(值:any,args?:any[]):any[]{
//检查是否存在要迭代的值
如果(值){
//创建实例变量以存储键和最终输出
let keyArr:any[]=Object.keys(值),
dataArr=[];
//在对象中循环,
//将值推送到返回数组
keyArr.forEach((key:any)=>{
数据传送推送(值[键]);
});
//返回结果数组
返回数据arr;
}
}
}
然后您可以在模板中使用它,如:


{{a.name}}
{{a.date}}
这里有一个


更新: 或者,如果希望将数据设置为与接收的其他数据相同的格式,则可以操纵响应。正如您提到的,首先需要一个if-else语句来检查数据的格式。如果数据采用上述格式,您可以执行以下操作以获得所需结果:

.subscribe(数据=>{
//添加状态码
this.data={状态:data.status,假日:[]}
let keyArr:any[]=Object.keys(data.holidays);
keyArr.forEach((key:any)=>{
//推送每个假日的值
这个.data.holidays.push(data.holidays[key][0]);
});
})

您可以发布您当前用于读取此文件的代码吗?当json没有给定过滤参数时,如询问特定月份,此功能非常有效。非常感谢您的帮助。当您提供参数并仅获取带有数组的单个对象时,代码将失败。在渲染之前,我可能需要通过if-else语句对其进行转换。是的,您需要这样做。到目前为止,您确实不能使用相同的模板,因为数据的构建是不同的。我猜您只需要执行if-else,如果数据是一种类型,则显示一个模板,如果数据是另一种类型,则显示另一个模板。或者操纵此数据,使其与另一个版本匹配,以便能够使用相同的模板。。。我认为这是您在本例中的选择…使用另一个选项更新了答案,以将数据处理为与其他数据一样的格式:)感谢AJT_82的帮助,我对Angular仍然很陌生。我还没有得到你的更新版本(第二个版本)来为我工作,我在尝试使用“this.data.holidays.push”时不断遇到错误,它说“this.data.holidays.push”。holidays不是一个属性或对象的一部分”或类似的东西。我尝试过几种方法,但是,我的编程知识没有我的飞机维修知识那么丰富……我喜欢职业生涯中期的过渡!:DAircraft维护,哇,非常酷!:)回到你的问题上来。。。你能不能用我的插件添加代码来展示这个问题。似乎存在某种类型的类型问题,这意味着模型和声明不匹配。。。
.map(res => res.json().holidays)