[英]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.