【问题标题】:Convert String to Location in Kotlin将字符串转换为 Kotlin 中的位置
【发布时间】:2021-03-13 05:19:58
【问题描述】:

我正在 Kotlin 中开发一个 Android 应用程序,我想在其中将“位置”对象保存到 SQLite 然后恢复稍后。我可以通过简单地在“Location”对象上调用“toString()”来将“Location”对象转换为“String”,如下所示:

var loc:Location
var str:String

... Code to init loc ...

str = loc.toString

String 之后有一个值,例如:

str = Location[gps 37.328528,-121.897877 hAcc=8 et=+1d15h4m55s443ms alt=-6.62762451171875 vel=0.36 bear=264.9 vAcc=17 sAcc=3 bAcc=97 {Bundle[mParcelledData.dataSize=96]}]

然后如何将生成的字符串转换回位置对象

更新 #1 这是我根据@DivijGupta 的建议使用 Gson 的尝试

    constructor(i_productName: String, i_date:String, i_location:Location?)
    {
        var parcel:Parcel?=Parcel.obtain()
        var locStr:String = ""
        
        var longitude:Double
        
        if(i_location!=null) {
            logEntryAction = i_productName
            logEntryDate = i_date
            
            longitude = i_location.longitude
            locStr = Gson().toJson(i_location)   <-----  Gson
        }
        else
        {
            longitude = 0.0
        }
        logEntryLongitude = longitude

【问题讨论】:

  • 从 Location 对象创建 Json 对象并将其转换回位置。您不能将 toString 输出更改为对象,它的存在只是为了便于阅读
  • 您需要Location 对象吗?或者可能具有高度和/或准确性的位置?您可以将纬度、经度另存为 double 在 2 个单独的列中。
  • @JanKubovy 正如我在问题中所说,我正在寻找一个“位置对象”。最好是精确的副本,而无需手动保存和重新加载每个字段。
  • 有人能告诉我为什么我被否决了吗?我是 stackoverflow 的新手,正在尝试正确使用它,但我不知道在这种情况下我做错了什么。
  • 我知道。 Location 对象与位置提供者关系密切,并且有一些内部(我没有探索),这使其不适合序列化/反序列化。这就是为什么我建议只存储相关属性。根据您想对该位置做什么,您可以稍后使用其他对象进行操作(例如developers.google.com/maps/documentation/javascript/reference/…)。您能否澄清一下您以后打算如何处理恢复的对象?

标签: android kotlin serialization type-conversion


【解决方案1】:

您也可以使用 Gson 库。

添加依赖

implementation 'com.google.code.gson:gson:2.8.6'

将对象转换为字符串

val jsonString = Gson().toJson(loc)

现在从字符串中获取对象

val location = Gson().fromJson(jsonString, Location::class.java)

【讨论】:

  • 我尝试了你的建议,但 Gson().toJson(loc) 返回 {"mElapsedRealtimeNanos":159085401507914} 我不明白为什么,因为 'loc' 是一个 Location 对象。我将代码添加到 Update #1 下的原始问题中
  • 我用 Date 对象对其进行了测试,效果很好。似乎只是位置对象有问题???
  • 似乎序列化 Location 对象有问题。相反,您可以使用要从位置对象中保存的字段创建自己的类。然后使用 Gson 序列化你创建的类的对象。
  • 我的错误:日期也没有被 Gson().toJson() 正确序列化。只是得到 toString() 输出...
  • 尝试替代方法,应该可以。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 2019-10-23
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
  • 2021-01-18
相关资源
最近更新 更多