首页 > 解决方案 > 通过逗号分隔符 Flutter 解析 JSON 字符串

问题描述

我有一些字符串需要分成纬度和经度以获得 LatLng,但是,不知道如何通过分隔符将其分开。

字符串是:{location: 40.748817,-73.985428}

我需要将它分成 Lat 和 lng 以创建标记,但不知道如何

标签: jsonparsingflutterdart

解决方案


根据实际的输入格式,它可能更容易或更难。

如果输入实际上是格式为的 JSON 映射{"location": "40.748817,-73.985428"},则只需先将其解析为 JSON,然后用逗号分割字符串:

List<double> parseCoordinates(String source) {
  var parts = jsonParse(source)["location"]?.split(",");
  if (parts == null || parts.length != 2) {
    throw FormatException("Not valid location coordinates", source);
  }
  return [double.parse(parts[0], double.parts[1])];
}

如果输入实际上是一个格式为 的字符串{location: 40.748817,-73.985428},它不是有效的 JSON,那么它看起来就像是用 RegExp 最容易解决的东西。

例子:

final _coordRE = RegExp(r"^\{location: (-?\d+(?:.\d+)), (-?\d+(?:.\d+))\}$");
List<double> parseCoordinates2(String source) {
  var match = _coordRE.firstMatch(source);
  if (match == null) throw FormatException("Not valid coordinates", source);
  return [double.parse(match[1]), double.parse(match[2])];
}

然后将其用作

var coords = parseCoordinates(source);
var lat = coords[0];
var lng = coords[1];

或者,由于您非常准确地知道格式,您可以自己提取子字符串,而不是使用 RegExp:

List<double> parseCoordinates(String source) {
  var prefix = "{location: ";
  if (source.startsWith(prefix) && source.endsWith("}")) {
    var commaIndex = source.indexOf(",", prefix.length);
    if (commaIndex >= 0) {
      var lat = double.parse(source.substring(prefix.length, commaIndex));
      var lng = double.parse(source.substring(commaIndex + 1, source.length - 1));
      return [lat, lng];
    }
  }
  throw FormatException("Not valid coordinates", source);
}

如果格式可以比您的示例变化更多(也许它允许-.5作为坐标,没有前导0),您将不得不调整正则表达式。一种选择是让捕获组简单地捕获[-.\d]+并依赖双解析器来处理语法错误。


推荐阅读