【问题标题】:Jackson JSON field mapping capitalization?Jackson JSON 字段映射大小写?
【发布时间】:2013-02-24 12:51:09
【问题描述】:

我不清楚杰克逊如何处理映射字段中的大写。如果有人可以提供帮助,我将不胜感激。

{"user":{"username":"user@host.com","password":"pwd","sendercompid":"COMPID","service":{"host":"address","port":6666,"service":"S1","serviceAsString":"s1"}},"MDReqID":"ghost30022","NoRelatedSym":1,"Symbol":["GOOG"],"MarketDepth":"0","NoMDEntryTypes":3,"MDEntryType":["0","1","2"],"SubscriptionRequestType":"1","AggregatedBook":"N"}:

上面是我的json,下面是我的例外......

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "MDReqID" (class com.myco.qa.fixrest.MarketDataRequest), not marked as ignorable (10 known properties: , "mdreqID", "marketDepth", "user", "subscriptionRequestType", "aggregatedBook", "mdentryType", "symbol", "mdupdateType", "noRelatedSym", "noMDEntryTypes"])

上面是我的例外,下面是我的班级……

public class MarketDataRequest {
    private User user;
    private String MDReqID;
    private char SubscriptionRequestType;
    private int MarketDepth;
    private int MDUpdateType;
    private char AggregatedBook;
    private int NoMDEntryTypes;
    private ArrayList<Character> MDEntryType;
    private int NoRelatedSym;
    private ArrayList<String> Symbol;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public String getMDReqID() {
        return MDReqID;
    }

    public void setMDReqID(String MDReqID) {
        this.MDReqID = MDReqID;
    }

    public char getSubscriptionRequestType() {
        return SubscriptionRequestType;
    }

    public void setSubscriptionRequestType(char subscriptionRequestType) {
        SubscriptionRequestType = subscriptionRequestType;
    }

...等等

【问题讨论】:

    标签: java json jackson


    【解决方案1】:

    在与接收到的 JSON 字符串中的属性名称匹配的 setter 上添加 @JsonProperty

    @JsonProperty("MDReqID")
    public void setMDReqID(String MDReqID) {
        this.MDReqID = MDReqID;
    }
    

    另外将@JsonProperty 注释添加到getter 以使您的输出以常规 格式显示:

    @JsonProperty("mDReqID")
    public String getMDReqID() {
        return MDReqID;
    }
    

    现在您可以随意命名变量了:

    private String mdReqID;
    

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,尝试UpperCamelCaseStrategy后仍然出现这个错误,策略将我的字段pContent设置为ObjectMapper属性Pcontent,因为不想为每个字段添加@JsonProperty,只需使用@最后改为987654324@

      【讨论】:

        【解决方案3】:

        由于您的 setter 方法被命名为 setMDReqID(…),Jackson 假定变量命名为 mDReqID,因为 Java 命名约定(变量应以小写字母开头)。

        如果您真的想要大写字母,请在 setter 上使用 @JsonProperty 注释(或 - 对于序列化 - 在 getter 上),如下所示:

        @JsonProperty("MDReqID")
        public void setMDReqID(String MDReqID) {
            this.MDReqID = MDReqID;
        }
        

        【讨论】:

        • 您写了“mDReqID”,但杰克逊需要“10 个已知属性:, mdreqID”。为什么都低?我面临同样的问题,JsonProperty 修复了它,但为什么所有字符都低于你提到的第一个?
        • 当无法访问类(它是一个依赖项)时,有没有办法正确反序列化对象?
        【解决方案4】:

        你也可以这样做

        @JsonNaming(PropertyNamingStrategy.UpperCamelCaseStrategy.class)
        

        在类上将 JSON 消息中的所有属性名称大写

        【讨论】:

        • 我们不想只在 1 上对所有属性进行操作
        • 如果它不适合你,请记住在你的 ObjectMapper 中设置 JacksonAnnotationIntrospector()。在我的情况下,我需要设置一对内省 - 我的自定义一个和这个 jackson 一个。
        • 试试@JsonNaming(PropertyNamingStrategy.PascalCaseStrategy.class),如果找不到UpperCamelCaseStrategy,它来自com.fasterxml.jackson.databind.PropertyNamingStrategy
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-20
        • 1970-01-01
        • 2020-04-17
        • 2018-12-02
        • 2018-01-12
        • 1970-01-01
        • 2018-02-28
        相关资源
        最近更新 更多