programing

잭슨 JSON 필드 맵핑 대문자는?

subpage 2023. 3. 25. 11:05
반응형

잭슨 JSON 필드 맵핑 대문자는?

나는 잭슨이 지도 분야에서 대문자화를 어떻게 다루는지 잘 모르겠다.도와주시면 감사하겠습니다.

{"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"}:

위는 내 아들, 아래는 예외...

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;
    }

...등

setter 메서드가 지정되어 있기 때문에setMDReqID(…)Jackson은 변수의 이름이mDReqIDJava 명명 규칙이 있기 때문입니다(변수는 소문자로 시작해야 합니다).

대문자를 사용하는 경우는, 다음과 같이 세터(또는 시리얼라이제이션의 경우)의 @Json 속성 주석을 사용합니다.

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

할 수도 있습니다.

@JsonNaming(PropertyNamingStrategy.UpperCamelCaseStrategy.class)

클래스에서 JSON 메시지의 모든 속성 이름을 대문자로 표시합니다.

더하다@JsonProperty수신된 JSON 문자열의 속성 이름과 일치하는 세터:

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

추가@JsonProperty게터에 대한 주석과 출력이 일반적인 형식으로 나타나도록 합니다.

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

이제 원하는 변수 이름을 지정할 수 있습니다.

private String mdReqID;

이 문제는 다음과 같이 해결합니다.

    @Getter
    @Setter
    static class UserInfo {
        //@JsonProperty("UUID")
        private String UUID = "11";
        private String UserName = "22";
        private String userName = "33";
        private String user_Name = "44";
        private String user_name = "55";
        private String User_name = "66";
        private boolean HasDeleted=true;
        private boolean hasDeleted=true;
        private boolean has_Deleted=true;
        private boolean has_deleted=true;
        private boolean HAS_DELETED=true;
    }

    public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE);
        objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);

        String s = objectMapper.writeValueAsString(new UserInfo());
        System.out.println(s);


        UserInfo userInfo = objectMapper.readValue(s, UserInfo.class);
        System.out.println(objectMapper.writeValueAsString(userInfo));
    }

출력:

{"UUID":"11","UserName":"22","userName":"33","user_Name":"44","user_name":"55","User_name":"66","HasDeleted":true,"hasDeleted":true,"has_Deleted":true,"has_deleted":true,"HAS_DELETED":true}

시도해 본 후에 나는 같은 문제에 직면했다.UpperCamelCaseStrategy그러나 이 오류는 여전히 발생했고, 전략은 나의 분야를 만들었다.pContentObjectMapper 속성으로Pcontent모든 필드에 대해 @JsonProperty를 추가하는 것을 원치 않으므로,gson대신 마침내

Json Naming Annotation을 사용하여 적절한 대소문자로 모든 클래스 필드 이름 가져오기

롬복으로.클래스에 getter 및 setter를 추가하지 않고 자동으로 작동하도록 하는 데이터 주석

import com.fasterxml.jackson.databind.annotation.JsonNaming;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;

import lombok.Data;

@JsonNaming(PropertyNamingStrategies.UpperCamelCaseStrategy.class)
@Data

언급URL : https://stackoverflow.com/questions/15303110/jackson-json-field-mapping-capitalization

반응형