programing

잭슨 JSON으로:미식별 필드, 무시하기로 표시되지 않다.

goodcopy 2022. 7. 24. 23:24
반응형

잭슨 JSON으로:미식별 필드, 무시하기로 표시되지 않다.

나는 자바 개체에 특정한 JSON문자열 변환할 필요가 있다.나는 JSON을 처리할 수 있도록 잭슨을 이용해요.나는 입력 JSON( 난 웹 서비스에서 읽은)을 통제할 수 없다.이것은 나의 입력 JSON:.

{"wrapper":[{"id":"13","name":"Fred"}]}

여기 단순화된 사용 사례: 있다.

private void tryReading() {
    String jsonStr = "{\"wrapper\"\:[{\"id\":\"13\",\"name\":\"Fred\"}]}";
    ObjectMapper mapper = new ObjectMapper();  
    Wrapper wrapper = null;
    try {
        wrapper = mapper.readValue(jsonStr , Wrapper.class);
    } catch (Exception e) {
        e.printStackTrace();
    }
    System.out.println("wrapper = " + wrapper);
}

나의 실체 수업은:

public Class Student { 
    private String name;
    private String id;
    //getters & setters for name & id here
}

내 경우 수업은 기본적으로 컨테이너 개체의 학생이 저희 목록을 가져올:.

public Class Wrapper {
    private List<Student> students;
    //getters & setters here
}

「가 반환됩니다.null빠진 건지 나는 뭘 놓쳤는지 확신하지 않는다.발발누 가가?

org.codehaus.jackson.map.exc.UnrecognizedPropertyException: 
    Unrecognized field "wrapper" (Class Wrapper), not marked as ignorable
 at [Source: java.io.StringReader@1198891; line: 1, column: 13] 
    (through reference chain: Wrapper["wrapper"])
 at org.codehaus.jackson.map.exc.UnrecognizedPropertyException
    .from(UnrecognizedPropertyException.java:53)

당신은:잭슨의 수준 주석을 사용할 수 있다.

import com.fasterxml.jackson.annotation.JsonIgnoreProperties

@JsonIgnoreProperties
class { ... }

그것은 당신이 POJO에 결정되지 않고 있는 모든 속성을 무시할 것이다.때 JSON에 있는 속성 2와 전 지도 쓰고 싶지 않은데 보고 있는 아주 유용해잭슨의 웹 사이트에서 더 많은 정보만약 당신이 어떤 비를 선언한 속성을 무시하고 싶다면,:를 써야 한다.

@JsonIgnoreProperties(ignoreUnknown = true)

사용할 수 있습니다.

ObjectMapper objectMapper = getObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

선언되지 않은 속성은 모두 무시됩니다.

첫 번째 답변은 거의 맞지만 필요한 것은 getter 메서드, NOT 필드를 변경하는 것입니다.필드는 비공개(자동 검출되지 않음)입니다.또, 양쪽이 모두 표시되는 경우는, getter가 필드보다 우선합니다.(프라이빗 필드를 표시할 수 있는 방법도 있지만, getter를 사용하고 싶다면 큰 의미가 없습니다.)

는 "getter"라는 .getWrapper()과 같이 주석을 달았습니다.

@JsonProperty("wrapper")

getter 메서드 이름을 그대로 사용하는 것이 좋습니다.

Jackson 2.6.0을 사용했을 때 효과가 있었습니다.

private static final ObjectMapper objectMapper = 
    new ObjectMapper()
        .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

및 설정:

@JsonIgnoreProperties(ignoreUnknown = true)

두 가지 방법으로 달성할 수 있습니다.

  1. 알 수 없는 속성을 무시하도록 POJO 표시

    @JsonIgnoreProperties(ignoreUnknown = true)
    
  2. 다음과 같이 POJO/json을 시리얼화/직렬 해제하는 Object Mapper를 설정합니다.

    ObjectMapper mapper =new ObjectMapper();            
    // for Jackson version 1.X        
    mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    // for Jackson version 2.X
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) 
    

세터와 게터를 추가하면 문제가 해결된다고 느꼈는데, 실제 문제는 어떻게 해결할 것인가 하는 것이지, 어떻게 에러를 억제/무시할 것인가 하는 것이 아닙니다."알 수 없는 필드.."라는 오류가 표시되었습니다. 무시할 수 없는 것으로 표시되지 않는다."

클래스 맨 위에 아래 주석을 사용하지만 json 개체를 구문 분석하여 입력을 제공할 수 없었습니다.

@Json Ignore Properties(무시)알 수 없음 = 참)

그리고 나서 나는 세터와 게터를 추가하지 않았다는 것을 깨달았다. "Wrapper"에 세터와 게터를 추가하자 "Student"는 마법처럼 작동했다.

이건 나한테 딱 맞아떨어졌어

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(
    DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

@JsonIgnoreProperties(ignoreUnknown = true)주석 없음.

이것은 모두 이 속성을 참조하는 것보다 더 잘 동작합니다.

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;

    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    projectVO = objectMapper.readValue(yourjsonstring, Test.class);

잭슨 2.0을 사용하는 경우

ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

문서에 따르면 선택한 필드 또는 알려진 모든 필드를 무시할 수 있습니다.

 // to prevent specified fields from being serialized or deserialized
 // (i.e. not include in JSON output; or being set even if they were included)
 @JsonIgnoreProperties({ "internalId", "secretKey" })

 // To ignore any unknown properties in JSON input without exception:
 @JsonIgnoreProperties(ignoreUnknown=true)

다음과 같은 코드로 동작했습니다.

ObjectMapper mapper =new ObjectMapper();    
mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

저는 아래의 방법을 시도했는데 잭슨과 같은 JSON 포맷을 읽을 때 효과가 있습니다.된 솔루션: "에 "noting getter"를 "getter"로 합니다.@JsonProperty("wrapper")

래퍼 클래스

public Class Wrapper{ 
  private List<Student> students;
  //getters & setters here 
} 

래퍼 클래스의 제안

public Class Wrapper{ 

  private StudentHelper students; 

  //getters & setters here 
  // Annotate getter
  @JsonProperty("wrapper")
  StudentHelper getStudents() {
    return students;
  }  
} 


public class StudentHelper {

  @JsonProperty("Student")
  public List<Student> students; 

  //CTOR, getters and setters
  //NOTE: If students is private annotate getter with the annotation @JsonProperty("Student")
}

다만, 다음의 형식의 출력을 얻을 수 있습니다.

{"wrapper":{"student":[{"id":13,"name":Fred}]}}

상세한 것에 대하여는, https://github.com/FasterXML/jackson-annotations 를 참조해 주세요.

잭슨이 불평하는 이유는 당신 수업에서 "wrapper"라는 필드를 찾을 수 없기 때문입니다.JSON 개체에 "wrapper"라는 속성이 있기 때문에 이렇게 됩니다.

Wrapper 클래스의 필드 이름을 students가 아닌 wrapper로 바꾸는 것이 수정이라고 생각합니다.

이 솔루션은 json 스트림을 읽을 때 일반적이며 도메인 클래스에서 올바르게 매핑되지 않은 필드는 무시할 수 있지만 일부 필드만 가져오면 됩니다.

import org.codehaus.jackson.annotate.JsonIgnoreProperties;
@JsonIgnoreProperties(ignoreUnknown = true)

자세한 해결책은 jsonschema2pojo와 같은 도구를 사용하여 json Response 스키마에서 Student와 같은 필수 도메인 클래스를 자동 생성하는 것입니다.후자는 임의의 온라인 json에서 스키마 변환기로 수행할 수 있습니다.

「 」를 적용하는 @JsonIgnoreProperties스프링 부트 디폴트잭슨입니다

응용 프로그램 구성 파일에서 다음과 같은 잭슨 개체 매퍼를 만들기 위한 bean을 정의합니다.

@Bean
    public ObjectMapper getObjectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        return mapper;
    }

모든 클래스를 표시할 필요는 없으며 알 수 없는 모든 속성이 무시됩니다.

json 속성과 java 속성의 이름이 일치하지 않으므로 필드 학생에게 아래와 같이 주석을 달아 주십시오.

public Class Wrapper {
    @JsonProperty("wrapper")
    private List<Student> students;
    //getters & setters here
}

문제는 JSON의 속성을 "wrapper"라고 부르고 Wrapper.class의 속성을 "students"라고 부릅니다.

그러니까...

  1. 클래스 또는 JSON에서 속성 이름을 수정합니다.
  2. StaxMan의 설명에 따라 특성 변수에 주석을 추가합니다.
  3. 세터에 주석을 추가합니다(있는 경우).

45개의 게시물과 10년이 지나도록 아무도 제 사례에 대한 정답을 올리지 않았습니다.

@Data //Lombok
public class MyClass {
    private int foo;
    private int bar;

    @JsonIgnore
    public int getFoobar() {
      return foo + bar;
    }
}

'Method of the Method'라는 .getFoobar() ,, 습, 습, 없은 없다.foobar속성(다른 속성에서 계산되었기 때문에)을 선택합니다. @JsonIgnoreProperties동작하지 않습니다.

해결책은 이 방법에 주석을 다는 것입니다.@JsonIgnore

제게 효과가 있었던 건 재산을 공개하는 거였어요

어느쪽인가의 변경

public Class Wrapper {
    private List<Student> students;
    //getters & setters here
}

로.

public Class Wrapper {
    private List<Student> wrapper;
    //getters & setters here
}

----또는 -----

JSON 문자열을 다음으로 변경합니다.

{"students":[{"id":"13","name":"Fred"}]}

나로서는 유일한 대사

@JsonIgnoreProperties(ignoreUnknown = true)

효과도 없었습니다.

추가만 하면 됩니다.

@JsonInclude(Include.NON_EMPTY)

잭슨 2.4.0

고객님의 의견

{"wrapper":[{"id":"13","name":"Fred"}]}

이름이 "wrapper"인 필드가 있는 오브젝트임을 나타냅니다.이것은 Students 컬렉션입니다.그래서 제가 추천하는 건

Wrapper = mapper.readValue(jsonStr , Wrapper.class);

어디에Wrapper로 정의됩니다.

class Wrapper {
    List<Student> wrapper;
}

새로운 Firebase Android는 몇 가지 대폭적인 변경을 도입했습니다.다음 문서는 다음과 같습니다.

[https://firebase.google.com/support/guides/firebase-android] :

Java 모델 개체 업데이트

2.x SDK와 마찬가지로 Firebase Database는 사용자가 전달한 Java 개체를 자동으로 변환합니다.DatabaseReference.setValue()JSON으로 변환하여 JSON을 Java 개체로 읽을 수 있습니다.DataSnapshot.getValue().

새로운 SDK에서 JSON을 Java 오브젝트로 읽을 때DataSnapshot.getValue(), JSON 내의 알 수 없는 속성은 디폴트로 무시되므로 더 이상 필요 없게 됩니다.@JsonIgnoreExtraProperties(ignoreUnknown=true).

Java 개체를 JSON에 쓸 때 필드/게터를 제외하기 위해 주석을 호출합니다.@Exclude대신@JsonIgnore.

BEFORE

@JsonIgnoreExtraProperties(ignoreUnknown=true)
public class ChatMessage {
   public String name;
   public String message;
   @JsonIgnore
   public String ignoreThisField;
}

dataSnapshot.getValue(ChatMessage.class)

AFTER

public class ChatMessage {
   public String name;
   public String message;
   @Exclude
   public String ignoreThisField;
}

dataSnapshot.getValue(ChatMessage.class)

Java 클래스에 없는 추가 속성이 JSON에 있는 경우 로그 파일에 다음 경고가 표시됩니다.

W/ClassMapper: No setter/field for ignoreThisProperty found on class com.firebase.migrationguide.ChatMessage

이 경고는 다음 명령을 사용하여 제거할 수 있습니다.@IgnoreExtraProperties주석을 달 수 있습니다.Firebase Database가 2.x SDK에서처럼 동작하고 알 수 없는 속성이 있는 경우 예외를 발생시키려면@ThrowOnExtraProperties주석을 달 수 있습니다.

클래스 필드를 비공개로 설정합니다.

public Class Student { 
    public String name;
    public String id;
    //getters & setters for name & id here
}

다른 하나의 방법은 application.properties의 이 속성입니다.spring.jackson.deserialization.fail-on-unknown-properties=false응용 프로그램에서 다른 코드를 변경할 필요가 없습니다.계약이 안정적이라고 생각되면 이 자산을 제거하거나 사실로 표시할 수 있습니다.

어떤 이유로 @JsonIgnoreProperties 주석을 클래스에 추가할 수 없고 Jetty 등의 웹 서버/컨테이너 내에 있는 경우.사용자 지정 제공자 내에서 ObjectMapper를 생성하고 사용자 지정할 수 있습니다.

import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;

import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;

@Provider
public class CustomObjectMapperProvider implements ContextResolver<ObjectMapper> {

    private ObjectMapper objectMapper;

    @Override
    public ObjectMapper getContext(final Class<?> cls) {
        return getObjectMapper();
    }

    private synchronized ObjectMapper getObjectMapper() {
        if(objectMapper == null) {
            objectMapper = new ObjectMapper();
            objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        }
        return objectMapper;
    }
}

POJO 클래스의 setter와 getter 메서드의 시그니처를 변경하는 것만으로 이 문제를 해결했습니다.getObject 메서드를 mapper가 찾고 있는 것과 일치하도록 변경하기만 하면 되었습니다.제 경우 원래 getImageUrl이 있었는데 JSON 데이터에 image_url이 있어서 매퍼가 꺼졌습니다.setter와 getters를 getImage_url과 setImage_url로 변경하였습니다.

이건 나한테 딱 맞아떨어졌다.

objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

이것은 OP와 같은 문제가 아닐 수도 있지만, 만약 누군가가 저와 같은 실수를 해서 이곳에 온다면, 이것은 그들의 문제를 해결하는 데 도움이 될 것입니다.JsonProperty 주석과 종속성이 다른 ObjectMapper를 사용했을 때 OP와 동일한 오류가 발생하였습니다.

이 방법은 다음과 같습니다.

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.annotation.JsonProperty;

동작하지 않음:

import org.codehaus.jackson.map.ObjectMapper; //org.codehaus.jackson:jackson-mapper-asl:1.8.8
import com.fasterxml.jackson.annotation.JsonProperty; //com.fasterxml.jackson.core:jackson-databind:2.2.3

POJO는 다음과 같이 정의해야 합니다.

응답 클래스

public class Response {
    private List<Wrapper> wrappers;
    // getter and setter
}

래퍼 클래스

public class Wrapper {
    private String id;
    private String name;
    // getters and setters
}

및 매퍼가 값을 읽습니다.

Response response = mapper.readValue(jsonStr , Response.class);

언급URL : https://stackoverflow.com/questions/4486787/jackson-with-json-unrecognized-field-not-marked-as-ignorable

반응형