来自Json的Angular2 Factory可以处理嵌入式字段吗

Can Angular2 Factory fromJson Handle Embedded Fields

我正在尝试将 JSON 提要中的外键数据扁平化为 class。我将该字段添加到 fromJson 工厂方法,它不会在浏览器控制台 (Dartium) 上出错。当我显示它时,该字段是空白的,所以看起来它没有通过,这并不奇怪。我在网上找不到该方法的任何文档。这是我的 JSON 数据:

{
"id": 386,
"artist_id": 57,
"label_id": 5,
"style_id": 61,
"title": "A Flower is a Lovesome Thing",
"catalog": "OJCCD-235",
"alternate_catalog": null,
"recording_date": "1957-04-01",
"notes": null,
"penguin": "**(*)",
"category": "jazz",
"label": {
  "label_name": "Fantasy"
  }
},

这是方法:

  factory Record.fromJson(Map<String, dynamic> record) =>
  new Record(_toInt(record['id']),
      record['title'],
      record['catalog'],
      record['artist_id'],
      record['label_id'],
      record['style_id'],
      record['alternate_catalog'],
      DateTime.parse(record['recording_date']),
      record['notes'],
      record['penguin'],
      record['category'],
      record['label_name']
  );

这是调用:

HttpRequest response = await HttpRequest.request(
      url, requestHeaders: headers);
List data = JSON.decode(response.responseText);
final records = data
    .map((value) => new Record.fromJson(value))
    .toList();
return records;

我也在 from Json 方法中尝试了 label:label_name。是否可以继续使用fromJson实例化对象?有没有任何地方可以解释Json 的文档?我找到了一些,但它几乎什么也没说。我也在考虑在 Rails 序列化程序中将其展平,或者作为最后的手段在数据库中创建视图。您可能会注意到,我还有两个外键尚未处理。

B计划

Günter 的回答解决了客户端的问题。如果任何阅读者更喜欢,还有一个 Rails 解决方案。它需要 Active Model Serializer。相关部分在这里:

class RecordSerializer < ActiveModel::Serializer
  attributes :id, :artist_id, :label_id, :style_id, :title, :catalog,    :alternate_catalog,
         :recording_date, :notes, :penguin, :category, :label_name 
 def label_name
    object.label.name
  end
end

指令 object.label.name 从标签 table 中检索名称值。这是结果 JSON:

{
"id": 386,
"artist_id": 57,
"label_id": 5,
"style_id": 61,
"title": "A Flower is a Lovesome Thing",
"catalog": "OJCCD-235",
"alternate_catalog": null,
"recording_date": "1957-04-01",
"notes": null,
"penguin": "**(*)",
"category": "jazz",
"label_name": "Fantasy"
},

不完全确定我是否理解问题,但我想这就是您要查找的内容

record['label']['label_name']