簡體   English   中英

使用未知密鑰對JSON進行序列化

[英]Serialization of JSON with unknown key

我正在使用json_serializable pub包來滿足我的所有RESTful API需求,並且效果很好,但是現在我正嘗試從Wikipedia序列化內容。

我的問題是響應結構,其中一個鍵是事先未知的,並且根據返回的頁面ID是動態的,這是一個示例:

我只想獲取頁面的介紹部分,我的查詢是: https : //en.wikipedia.org/w/api.php?action= query &format=json&prop=extracts&redirects=1&exintro=1&explaintext=1&titles=Stack%20Overflow

響應將是:

{
    "batchcomplete": "",
    "query": {
        "pages": {
            "21721040": {
                "pageid": 21721040,
                "ns": 0,
                "title": "Stack Overflow",
                "extract": "Stack Overflow is a privately held website, the flagship site of ......."
            }
        }
    }
}

最終,我只想獲取內部extract字符串,但是在“途中”,我在pages下有頁面ID。

我無法使用json_serializable軟件包或顯式編寫JSON導入代碼時都無法知道密鑰是什么,所以我找不到如何獲取對象。 可能嗎?

PS,我確實認為我發現了一種需要兩次API調用的方法-如果我添加indexpageids標志並將其設置為true, 我將收到一個名為pageids的附加字典條目,其頁面ID號為string ,那么我可以使用檢索到的第二個API調用中的字符串。

我仍然不知道確切的方法,但是我很確定這是可能的,但是每次發送2個API請求都是很昂貴的,我想知道是否還有一種更優雅的方法。

確保您使用最新版本的json_serializable。 Map<String, Page>用於鍵值對:

@JsonSerializable()
class Query {
  final Map<String, Page> pages;

  Query(this.pages);
  factory Query.fromJson(Map<String, dynamic> json) => _$QueryFromJson(json);
  Map<String, dynamic> toJson() => _$QueryToJson(this);
}

只是為了證明它有效,這是json_serializable生成的內容:

Query _$QueryFromJson(Map<String, dynamic> json) {
  return new Query((json['pages'] as Map<String, dynamic>)?.map((k, e) =>
      new MapEntry(
          k, e == null ? null : new Page.fromJson(e as Map<String, dynamic>))));
}

您可以獲取json鍵,然后使用該鍵將值提取為

var response = await http.get(API_ENDPOINT);
var responseJson = json.decode(response.body);
Map<String, dynamic> json =responseJson['query']['pages'];
String pageId = json.keys.toList()[0]; // 0 for first page, you can iterate for multiple pages
firstPage = json[pageId]; 
String title = firstPage["title"];

如果動態密鑰中還有另一級動態密鑰,該怎么辦? 我必須為第二個類編輯生成的json_serializable,以僅使用json而不是生成的json ['key']。

Page _$PageFromJson(Map<String, dynamic> json) {
  return new Page((json as Map<String, dynamic>)?.map((k, e) =>
  new MapEntry(
      k, e == null ? null : new SecondPage.fromJson(e as Map<String, dynamic>))));
}

感覺有更好的方法嗎? 因為每次我在任何文件中進行更改並運行generator時,生成的代碼都會被覆蓋。

我是新來的人,所以我無法評價答案和發表評論。 但是boformer的回答對我有所幫助,但后來我遇到了第二個問題。

編輯:我通過反復試驗找到了解決方案,使用:

class Query {
  final Map<String, Map<String, SecondPage>> pages;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM