잭슨 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)
두 가지 방법으로 달성할 수 있습니다.
알 수 없는 속성을 무시하도록 POJO 표시
@JsonIgnoreProperties(ignoreUnknown = true)
다음과 같이 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"라고 부릅니다.
그러니까...
- 클래스 또는 JSON에서 속성 이름을 수정합니다.
- StaxMan의 설명에 따라 특성 변수에 주석을 추가합니다.
- 세터에 주석을 추가합니다(있는 경우).
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
'programing' 카테고리의 다른 글
Java에서 정적 메서드에서 getClass()를 호출하려면 어떻게 해야 합니까? (0) | 2022.07.24 |
---|---|
별도의 모듈에서 namesleded 액션을 디스패치할 수 없음: [vuex] 알 수 없는 액션 유형 (0) | 2022.07.24 |
console.log 없이 vuej 로그인 (0) | 2022.07.24 |
소수점 이하 두 자리까지 반올림하다 (0) | 2022.07.24 |
Android를 사용하려면 컴파일러 호환성 수준 5.0 또는 6.0이 필요합니다.대신 '1.7'을 찾았습니다.[ Android Tools ]> [ Fix Project Properties ]를 사용해 주세요. (0) | 2022.07.24 |