【问题标题】:List of Objects returned as JSON object [duplicate]作为 JSON 对象返回的对象列表 [重复]
【发布时间】:2023-04-08 05:07:01
【问题描述】:

在开发 Web 服务时,我构建了一个 GET 方法来返回系统对象的 JSON 列表(自定义对象,而不是 java.lang 类型)。出乎意料的是,我收到了一个带有 1 个参数的 JSON 对象,其中包含我最初期望的数组。我在这里错过了什么?

系统类

@XmlRootElement
public class System
{
    private long id;
    private String name;

    @XmlElement
    public long getId()
    {
       return id;
    }
    public void setId(long pId)
    {
       id = pId;
    }

    @XmlElement
    public String getName()
    {
       return name;
    }

    public void setName(String pName)
    {
       name = pName;
    }
}

REST 服务

@Path("/systems")
public class SystemHandler
{
   @GET
   @Path("/list")
   @Produces({MediaType.APPLICATION_JSON})
   public List<System> getSystems(@Context SecurityContext sc)
   {
      List<System> list = null;
      //Populate the list
      return list;
   }
}

/systems/list 的结果

{
    "system": [
        {
            "id": "248",
            "name": "FOO"
        },
        {
            "id": "617",
            "name": "BAR"
        }
    ]
}

在我期待的时候

[
    {
        "id": "248",
        "name": "FOO"
    },
    {
        "id": "617",
        "name": "BAR"
    }
]

【问题讨论】:

  • 我不知道问题的根源,但它的包装 JSON 类型,我的情况是一样的,您可以通过执行 @XmlRootElement(name = "my_system") 来更改密钥 "system"
  • 你在使用带有 Jersey 的 Glassfish 吗?
  • @Maraboc 感谢您与我一起思考。这确实将密钥更改为“my_system”,但不会将其删除。重命名类也没有
  • @peeskillet 我做到了......我去找一个黑暗的角落躲起来,现在感到羞愧:|知道为什么在其他 REST 服务上运行良好吗?它不是该项目中开发的第一个

标签: java json rest jersey


【解决方案1】:

删除@XmlRootElement 注释,这是告诉杰克逊将列表包装在系统属性中,不是必需的。

【讨论】:

  • 删除它会给我以下错误:严重:Java 类 java.util.ArrayList 和 Java 类型 java.util.List,并且未找到 MIME 媒体类型 application/json 此外,XmlRootElement 注释也适用于其他类。谢谢你的想法。
  • 啊,在这种情况下,听起来杰克逊(或其他用于将 java 编组为 json 的东西)默认情况下没有设置为映射 bean。正如其他 cmets 所要求的那样,您知道这是用什么技术堆栈构建的吗?通常这会毫无问题地编组,但看起来您需要更多配置。
猜你喜欢
  • 1970-01-01
  • 2019-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-06
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
相关资源
最近更新 更多