json - 通过逗号分隔符 Flutter 解析 JSON 字符串
问题描述
我有一些字符串需要分成纬度和经度以获得 LatLng,但是,不知道如何通过分隔符将其分开。
字符串是:{location: 40.748817,-73.985428}
我需要将它分成 Lat 和 lng 以创建标记,但不知道如何
解决方案
根据实际的输入格式,它可能更容易或更难。
如果输入实际上是格式为的 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]+
并依赖双解析器来处理语法错误。
推荐阅读
- javascript - 在 mongoDB/Mongoose 上使用 find 和 aggregate 来获取数据
- hibernate - 在各个微服务中创建会话工厂好不好
- android - Android上的Firebase可调用函数socketTimeout
- javascript - Angular 应用程序的 Redis 客户端
- angular - 重置 Observable.timer()
- php - PHP ODBC I/O 包默认不是线程安全的
- button - 如何在 NSIS 的浏览按钮上放置位图图像?
- ms-access - 基于另一个值的 MS Access 更新记录
- bash - 合并公共列上的两个文件并使用 awk 打印所有列
- dart - 在 Flutter 中使用 Google Play 游戏服务?