【问题标题】:Converting JSON to Java / Scala using GSON (or any other Library) -> Bean Structure unclear使用 GSON(或任何其他库)将 JSON 转换为 Java / Scala -> Bean 结构不清楚
【发布时间】:2012-03-30 08:22:53
【问题描述】:

我有这个 JSON 字符串:

    {
  "totalSize" : 2,
  "done" : true,
  "records" : [ {
    "attributes" : {
      "type" : "Article__c",
      "url" : "/services/data/v20.0/sobjects/Article__c/a01d00000030gSxAAI"
    },
    "Name" : "ABC - Fri Mar 30 01:54:57 CEST 2012"
  }, {
    "attributes" : {
      "type" : "Article__c",
      "url" : "/services/data/v20.0/sobjects/Article__c/a01d00000030gSaAAI"
    },
    "Name" : "XYZ - Fri Mar 30 01:52:25 CEST 2012"
  } ]
}

我需要一个 Java 对象来获取键的值。我尝试使用 Gson(但另一个简单的解决方案也可以)。我认为bean的结构应该是这样的:

case class AttributeBean(typ: String, url: String)
case class RecordBean(attributes: List[AttributeBean], name: String)
case class ResponseBean(totalSize: Int, done: Boolean, records: List[RecordBean])

很遗憾,这不起作用。我执行以下 Gson 调用:

val response : ResponseBean = gson.fromJson(responseAsString, classOf[ResponseBean])

也不例外,但我得到了 bean 的这个 WRONG 内容:

ResponseBean(0,false,null)

它应该是 2,true,“有记录的列表”。有人可以告诉我解析 JSON 字符串的 bean 的正确结构吗?

提前谢谢你...

最好的问候, 启

【问题讨论】:

    标签: java json scala gson


    【解决方案1】:

    我不太明白你使用的符号。但是我在那里看到了几个错误:

    • 属性不是一个列表,只是一个对象,或者至少这是你的 json 状态
    • AttributeBean 的字段应该是 type,而不是 typ
    • Name 属性应该在类定义中大写(如果我查看 json)

    否则,您对 GSON 的期望似乎很好,代码也很好。 GSON 易于使用,我强烈推荐它。您的代码中唯一可能出现的其他问题是标量问题,因为我不懂这种语言。

    编辑添加一个 Java 示例,说明如何使类字段与 json 字段不匹配:

    {
       "type" : "Article__c",
       "url" : "/services/data/v20.0/sobjects/Article__c/a01d00000030gSxAAI"
    }
    

    还有java代码:

    public class AttributeBean {
        public String url;
        @SerializedName("type")
        public String typ;
    }
    

    因为有了这个注解,解析就可以了。

    【讨论】:

    • 是scala,type是scala中的关键字。
    • 我不是提问者,以防你问我。
    • 感谢您的快速回答。我修复了“名称”和“属性:列表”错误。不过,我无法将“typ”更改为“type”,因为它是 Scala 中的关键字。我需要一个解决方法。也许 Gson 用户指南会帮助我。目前,我的 bean.toString 仍然是:“ResponseBean(0,false,null)”。因为只有“typ”这个bug,不应该是“ResponseBean(2,true,null)”吗?
    • 要将关键字用作标识符,请用反引号将它们括起来:因此`type` 指的是标识符type
    • 如果是 java 我可以帮助你。我可以包含与类字段不匹配的序列化名称的 Java 修复吗?
    【解决方案2】:

    Gson 本身并不适用于 Scala“案例类”。将 Json 与“案例类”结合使用的两个最佳选择是 Jerksonlift-json。在使用两者之后,我会推荐 Jerkson,因为它的速度和对流式读写的支持,但两个库都应该满足您的用例。

    【讨论】:

    • 谢谢史蒂夫。明天我将尝试其中一个......我认为案例类是 JSON 解析的一个非常好的用例 - 更少的样板代码......
    • 我同意!样板文件少得多,您可以向案例类添加方法以帮助转换解析的数据。
    • Jerkson 不支持 Scala 2.10。我找到了 Jerkson 项目的替代分支,它具有 2.10 支持实现,但它没有用于检索库的 maven 存储库。
    【解决方案3】:

    您可以将字段命名为 `type`(反引号),这可能有助于解决字段名称已被关键字占用的问题。

    【讨论】:

      猜你喜欢
      • 2018-11-07
      • 1970-01-01
      • 1970-01-01
      • 2020-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多