【问题标题】:Map to String/String to Map conversion in GroovyGroovy 中的 Map 到 String/String 到 Map 的转换
【发布时间】:2013-07-12 14:26:31
【问题描述】:

我有一个 json 对象,它被传递到保存函数中

{
  "markings": {
      "headMarkings": "Brindle",
      "leftForeMarkings": "",
      "rightForeMarkings": "sock",
      "leftHindMarkings": "sock",
      "rightHindMarkings": "",
      "otherMarkings": ""
}

** 编辑 **

系统对其进行解析并将其作为映射传递给我的函数。我实际上并没有 JSON,虽然我自己构建 JSON 并不难,但这似乎有点矫枉过正

* 结束编辑 **

toString() 函数最终将结果放入数据库中

"[rightForeMarkings:, otherMarkings:, leftForeMarkings:sock, leftHindMarkings:sock, rightHindMarkings:, headMarkings:brindle]"

然后我想通过调用将其保存为字符串(相当简单)

params.markings.toString()

从这里,我保存信息并返回更新的信息。

我的问题是,由于我将对象作为字符串存储在数据库中,我似乎无法将标记作为地图恢复(然后转换为 JSON)。

我尝试了一些不同的方法都无济于事,尽管我完全有可能在这些方面做错了……

Eval.me(Item.markings)
evaluate(Item.markings)
Item.markings.toList()

提前感谢您的帮助!

【问题讨论】:

  • 您可以使用JsonSlurper。这个answer 应该会有所帮助。
  • JsonSlurper 可能会工作。这不是我们实施的理想解决方案,但我想我会试一试,让您知道最终会发生什么。
  • 看起来您没有适当地保留字符串。我正在为你测试一些东西,会让你知道结果。

标签: json grails groovy


【解决方案1】:

进行我的测试。

在 Grails 中使用 JSON 转换器,我认为应该是这样的方法:(@JamesKleeh 和 @GrailsGuy 的同义词)

def json = '''{
                  "markings": {
                      "headMarkings": "Brindle",
                      "leftForeMarkings": "",
                      "rightForeMarkings": "sock",
                      "leftHindMarkings": "sock",
                      "rightHindMarkings": "",
                      "otherMarkings": ""
                   }
                }'''

def jsonObj = grails.converters.JSON.parse(json)
//This is your JSON object that should be passed in to the method
print jsonObj //[markings:[rightForeMarkings:sock, otherMarkings:, leftForeMarkings:, leftHindMarkings:sock, rightHindMarkings:, headMarkings:Brindle]]

def jsonStr = jsonObj.toString()
//This is the string which should be persisted in db
assert jsonStr == '{"markings":{"rightForeMarkings":"sock","otherMarkings":"","leftForeMarkings":"","leftHindMarkings":"sock","rightHindMarkings":"","headMarkings":"Brindle"}}'

//Get back json obj from json str
def getBackJsobObj = grails.converters.JSON.parse(jsonStr)
assert getBackJsobObj.markings.leftHindMarkings == 'sock'

【讨论】:

  • toString() 不会给我与您的 jsonStr 相同的字符串。它与 jsonObj 相同。此外,它作为映射的参数传递给我的函数。系统会在它到达我的功能之前将其转换。
  • 从哪里获得传递给方法的基本 json 对象?在应用任何类型的逻辑之前,您最初是否有一个 json 字符串或对象? @大卫齐曼
  • 我有一个对象。我很抱歉。我应该在我最初的问题中说明这一点。如果我注销标记,它与您的 jsonObj 相同。看起来我能让你的工作正常(仍在做一些测试)。我会让你知道结果:)
  • 感谢您提供全面的结果。它工作得非常好。我不得不稍微修改一下,但这是由于我们系统的架构而不是您的代码。
  • @DavidZiemann 很高兴它有帮助。我只是在指导握弓箭,JamesKleeh 和 GrailsGuy 指示了靶心。 ;-)
【解决方案2】:

如果我理解正确,您想将字符串转换为 JSON 对象吗?您实际上可以绕过将其转换为地图,并将其直接解析为 JSON 对象:

import grails.converters.JSON

def json = JSON.parse(Item.markings)

这将为您提供整个 JSON 对象,然后您可以像引用地图一样引用这些值。

【讨论】:

  • 我在返回数据时调用render Item as JSON。我认为这与JSON.parse(Item) 的作用相同,还是我弄错了?
  • @DavidZiemann 是的,它们非常相似,但您实际上并没有尝试渲染 JSON,对吧?只是得到它的参考?
  • 说实话,我不确定其中的区别。它是 API 的一部分,我将它包装在 withFormat{JSON{}} 语法中。如果你不知道,我对 grails/groovy 还是很陌生:)
  • 这可能与toString() 转换地图的方式有关吗?我更新了问题以包含存储在数据库中的字符串
【解决方案3】:

编辑#2:

因此,显然没有“安全”的方法可以将该字符串转换回没有自定义内容的地图。我建议将结构原样保存在数据库中。如果你能做到,那么你只需要JSON.parse()

【讨论】:

  • 这样做是行不通的,部分原因是事物传递方式的性质。 Groovy 获取传入的 JSON 并创建 params 对象。我在这里(我认为)它剥离了空字符串上的“”。当我使用JSON.parse() 时,当它到达空项目后的第一个, 时出现错误(即:headMarkings)
猜你喜欢
  • 2018-03-22
  • 2013-12-18
  • 1970-01-01
  • 1970-01-01
  • 2018-05-08
  • 2017-07-18
  • 2016-07-29
  • 2013-05-24
  • 2014-01-29
相关资源
最近更新 更多