杰克逊@JsonPropertyOrder被忽略

Jackson @JsonPropertyOrder is ignored

提问人:Alviere 提问时间:10/17/2015 更新时间:9/10/2023 访问量:22467

问:

我目前正在使用 Spark 框架开发 RESTful 应用程序,并使用 Jackson 进行序列化。我遇到了这样的问题:@JsonPropertyOrder被忽略了。

这是我的 POJO:

@Data
@JsonPropertyOrder({"id", "company", "title", "infos", "startDate", "endDate"})
public class Info {
    @JsonProperty("id")
    long id;

    @JsonProperty("company")
    Company company;

    @JsonProperty("title")
    String title;

    @JsonProperty("infos")
    List<Prize> infos;

    @JsonProperty("startDate")
    Date startDate;

    @JsonProperty("endDate")
    Date endDate;

    public Info() {}
}

我用这种方法生成JSON:

public static String generateJSONResponse(Object response) {
    if (responseObjectMapper == null) {
        responseObjectMapper = new ObjectMapper(new JsonFactory());
        responseObjectMapper.enable(SerializationFeature.INDENT_OUTPUT);
    }

    try {
        return responseObjectMapper.writeValueAsString(response);
    } catch (IOException ioe) {
        // Must not occur
    }

    // Something really unexpected happened, so we return unknown response;
    return ErrorMessages.ERROR_RESPONSE_UNKNOWN;
}

最后我收到这个:

{
  "status": 0,
  "result": {
    "infoList": [
      {
        "infos": [...],
        "id": 2,
        "title": "...",
        "company": {...},
        "startDate": 1445238000000,
        "endDate": 1445792400000
      },
      ...
    ]
  }
}

我做错了什么?还是杰克逊出了什么问题?谁能帮我解决这个问题?

此外,我使用 Jackson 版本 2.6.3 和 2.3.5 尝试了此操作。两者的工作方式相同。

java json 杰克逊

评论

0赞 andersschuller 10/17/2015
当我尝试使用 Jackson 2.6.2 复制您的代码时,它似乎工作正常。您的设置还有什么特别之处吗?什么是注释?也许它以某种方式干扰了?@Data
3赞 try-catch-finally 10/17/2015
请问,为什么要保留属性的顺序?JSON 规范清楚地表明对象是无序集合 “” 和 ”An object is an unordered collection of zero or more name/value pairs, [...]Implementations whose behavior does not depend onmember ordering will be interoperable in the sense that they will not be affected by these differences."
0赞 Alviere 10/18/2015
@Dataannotation 是一个 Lombok 库注解,它使我不必为每个字段编写 getter 和 setter。我不知道它是否以某种方式干扰了,但我会对此进行调查。
13赞 Alviere 10/18/2015
关于我为什么需要它:只是为了其他开发人员的 JSON 可读性。
0赞 Alviere 10/18/2015
据我测试,龙目岛注解无论如何都不会影响排序。 仍然被忽略。@Data@JsonPropertyOrder

答:

0赞 Ashwin Jayaprakash 9/22/2016 #1

注解 JavaDoc 也呼应了“无序”集合:https://www.javadoc.io/doc/com.fasterxml.jackson.core/jackson-annotations/latest/com/fasterxml/jackson/annotation/JsonPropertyOrder.html

此注解可能对反序列化有影响,也可能没有影响:对于 基本的JSON处理没有效果,但对于其他支持的数据 类型(或结构约定)可能存在。

这可能解释了为什么它不起作用。

-4赞 Nitin Jain 5/2/2018 #2

Lomboks @Data干扰了 Jackson 反序列化。删除它并尝试..

0赞 Hoiama Rodrigues 7/7/2021 #3

检查是否导入了正确的“JsonPropertyOrder”包:

这对我有用:import com.fasterxml.jackson.annotation.JsonPropertyOrder;