【问题标题】:extracting JSON data in Flutter在 Flutter 中提取 JSON 数据
【发布时间】:2021-09-22 00:34:18
【问题描述】:

我正在尝试在 Flutter 中呈现元素列表,并且列表数据来自 REST API。

我似乎找不到可以让我提取参数的示例

frm_payload

来自以下 JSON 输出。消息再次出现,我希望得到一个显示该字段值的字符串列表,在以下示例中为:

T1BF

{
"result": {
    "end_device_ids": {
        "device_id": "unitx1",
        "application_ids": {
            "application_id": "jandraapp"
        },
        "dev_eui": "A8A55920F540DBDF",
        "dev_addr": "260BC823"
    },
    "received_at": "2021-07-12T18:28:33.504479658Z",
    "uplink_message": {
        "f_port": 1,
        "f_cnt": 5,
        "frm_payload": "T1BF",
        "rx_metadata": [
            {
                "gateway_ids": {
                    "gateway_id": "packetbroker"
                },
                "packet_broker": {
                    "message_id": "01FADZMPC8E58VRNYC5WWQRRFS",
                    "forwarder_net_id": "000013",
                    "forwarder_tenant_id": "ttnv2",
                    "forwarder_cluster_id": "ttn-v2-eu-1",
                    "forwarder_gateway_eui": "58A0CBFFFE803615",
                    "forwarder_gateway_id": "eui-58a0cbfffe803615",
                    "home_network_net_id": "000013",
                    "home_network_tenant_id": "ttn",
                    "home_network_cluster_id": "ttn-eu1"
                },
                "time": "2021-07-12T18:28:33.277776956Z",
                "rssi": -90,
                "channel_rssi": -90,
                "snr": 7.75
            }
        ],
        "settings": {
            "data_rate": {
                "lora": {
                    "bandwidth": 125000,
                    "spreading_factor": 7
                }
            },
            "data_rate_index": 5,
            "coding_rate": "4/5",
            "frequency": "867500000"
        },
        "received_at": "2021-07-12T18:28:33.295783006Z",
        "consumed_airtime": "0.051456s"
    }
}

}

这是我从我的飞镖代码中调用它的方式,在哪里

发帖

是解码后的 JSON 对象

"frm_payload: ${post["result"]["uplink_message"]["frm_payload"]}"

这是我在颤振中的完整代码:

    import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:http/http.dart';

void main() => runApp(const MyApp());

/// This is the main application widget.
class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  static const String _title = 'Flutter Code Sample';

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: _title,
      home: MyStatefulWidget(),
    );
  }
}

/// This is the stateful widget that the main application instantiates.
class MyStatefulWidget extends StatefulWidget {
  const MyStatefulWidget({Key? key}) : super(key: key);

  @override
  State<MyStatefulWidget> createState() => _MyStatefulWidgetState();
}

/// This is the private State class that goes with MyStatefulWidget.
class _MyStatefulWidgetState extends State<MyStatefulWidget> {
  int _selectedIndex = 0;
  static const TextStyle optionStyle =
      TextStyle(fontSize: 30, fontWeight: FontWeight.bold);
  static const List<Widget> _widgetOptions = <Widget>[
    Text(
      'Index 0: Homexx',
      style: optionStyle,
    ),
    Text(
      'Index 1: Business',
      style: optionStyle,
    ),
    Text(
      'Index 2: School',
      style: optionStyle,
    ),
    Text(
      'Index 3: Settings',
      style: optionStyle,
    ),
  ];

  void _onItemTapped(int index) {
    setState(() {
      _selectedIndex = index;
    });
  }

  final url =
      "https://eu1.cloud.thethings.network/api/v3/as/applications/jandraapp/devices/unitx1/packages/storage/uplink_message";
  // final url = "https://jsonplaceholder.typicode.com/posts";

  var _postsJson = [];

  void fetchPosts() async {
    print('FETCHPOSTS_PRETRY');
    try {
      final response = await get(Uri.parse(url));
      final jsonData = jsonDecode(response.body) as List;

      setState(() {
        _postsJson = jsonData;

        print('FETCHPOSTS');
      });
    } catch (err) {
      print(' FORMATTING ERROR');
    }
  }

  

    @override
      void initState() {
        super.initState();
        fetchPosts();
      }
    
      @override
      Widget build(BuildContext context) {
        print(_postsJson.length);
        return Scaffold(
          appBar: AppBar(
            title: const Text('Device Status Screen'),
          ),
          body: ListView.builder(
            itemCount: _postsJson.length,
            itemBuilder: (context, i) {
              final post = _postsJson[i];
    
              return Text(
                  "frm_payload: ${post["result"]["uplink_message"]["frm_payload"]}"); // ***** THIS IS THE PROBLEM CODE*******
    
              // return Text("Title: ${post["title"]}\n Body: ${post["body"]}\n\n");
            },
          ),
          bottomNavigationBar: BottomNavigationBar(
            items: const <BottomNavigationBarItem>[
              BottomNavigationBarItem(
                icon: Icon(Icons.home),
                label: 'Home',
                backgroundColor: Colors.red,
              ),
              BottomNavigationBarItem(
                icon: Icon(Icons.history),
                label: 'History',
                backgroundColor: Colors.green,
              ),
              BottomNavigationBarItem(
                icon: Icon(Icons.settings),
                label: 'Settings',
                backgroundColor: Colors.pink,
              ),
            ],
            currentIndex: _selectedIndex,
            selectedItemColor: Colors.amber[800],
            onTap: _onItemTapped,
          ),
        );
      }
    }

【问题讨论】:

    标签: json flutter dart parsing


    【解决方案1】:

    不确定问题出在哪里 - 这在 dartpad.dev 中有效:

    void main() {
      const post=<String, dynamic>{
    "result": {
        "end_device_ids": {
            "device_id": "unitx1",
            "application_ids": {
                "application_id": "jandraapp"
            },
            "dev_eui": "A8A55920F540DBDF",
            "dev_addr": "260BC823"
        },
        "received_at": "2021-07-12T18:28:33.504479658Z",
        "uplink_message": {
            "f_port": 1,
            "f_cnt": 5,
            "frm_payload": "T1BF",
            "rx_metadata": [
                {
                    "gateway_ids": {
                        "gateway_id": "packetbroker"
                    },
                    "packet_broker": {
                        "message_id": "01FADZMPC8E58VRNYC5WWQRRFS",
                        "forwarder_net_id": "000013",
                        "forwarder_tenant_id": "ttnv2",
                        "forwarder_cluster_id": "ttn-v2-eu-1",
                        "forwarder_gateway_eui": "58A0CBFFFE803615",
                        "forwarder_gateway_id": "eui-58a0cbfffe803615",
                        "home_network_net_id": "000013",
                        "home_network_tenant_id": "ttn",
                        "home_network_cluster_id": "ttn-eu1"
                    },
                    "time": "2021-07-12T18:28:33.277776956Z",
                    "rssi": -90,
                    "channel_rssi": -90,
                    "snr": 7.75
                }
            ],
            "settings": {
                "data_rate": {
                    "lora": {
                        "bandwidth": 125000,
                        "spreading_factor": 7
                    }
                },
                "data_rate_index": 5,
                "coding_rate": "4/5",
                "frequency": "867500000"
            },
            "received_at": "2021-07-12T18:28:33.295783006Z",
            "consumed_airtime": "0.051456s"
        }
    }};
      
      print("frm_payload: ${post["result"]["uplink_message"]["frm_payload"]}");
    }
    

    【讨论】:

    • 真的非常感谢。是的,我也可以像你一样在 dart dev 工作。我已经从 Flutter 添加了我的完整代码。也许是我做错了什么?在示例中,我总是得到“格式错误”,因为我为此创建了一个 try catch 条件。
    • 我认为您没有以正确的方式对其进行解码。只需将final jsonData = jsonDecode(response.body) as List; 替换为final jsonData = jsonDecode(response.body);。您不必将其转换为列表 - 因为解析的对象是 Map.
    • 哇,谢谢!我现在得到:错误:需要一个“List”类型的值,但得到一个“_JsonMap”类型的值 - 是导致此错误的小部件吗? ifso 如何在下拉列表中获取 frm_payload 列表?
    • 它看起来像是一个身份验证问题。因为我正在从我的机器访问 JSON 字符串,所以它没有显示问题。我可以选择获取 API 密钥、OAuth 访问令牌或会话 cookie。我应该使用哪一个以及如何使用?
    猜你喜欢
    • 2019-03-26
    • 2019-12-30
    • 1970-01-01
    • 2021-08-08
    • 2021-06-13
    • 2017-06-26
    • 1970-01-01
    • 2021-11-29
    • 2020-07-18
    相关资源
    最近更新 更多