有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Jackson批注无法分析布尔字段

我的数据对应的Java类如下:

package com.some.package;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.gson.reflect.TypeToken;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.lang.reflect.Type;


@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class A {
    public static final Type UNMARSHALLER_TYPE = new TypeToken<A>(){}.getType();

    @JsonProperty("id")
    String id;

    @JsonProperty("name")
    String name;

    @JsonProperty("is_enabled")
    boolean isEnabled;
}

我编写的测试用例类失败,因为isEnabled总是false

package com.some.package;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
import org.junit.Test;

import java.io.IOException;

import static org.junit.Assert.*;

/**
 * Created by tanny on 16/11/19.
 */
public class ATest {

    private static final String RESPONSE_JSON = "{\"is_enabled\": true, \"name\": \"XXX\", \"id\":\"mock-id\", \"num\":12}";

    @Test
    public void testAUnmarshaller() throws IOException {
        // given
        PapiSite payload = new Gson().fromJson(RESPONSE_JSON, A.UNMARSHALLER_TYPE);

        // then
        assertNotNull(payload);
        assertTrue(payload.isEnabled());
        assertEquals("XXX", payload.getName());
    }
}

看起来jackson data binder无法解析测试中传递的json字符串。有没有可能我做错了什么? 任何帮助或指导都将不胜感激


共 (1) 个答案

  1. # 1 楼答案

    问题是您正在混合两个不同的库jacksonGsonJsonPropertyJsonIgnoreProperties属于jackson,并且您正在测试用例中尝试使用Gson进行解析

    使用Gson:您可以使用@SerializedName使用Gson时,您可以找到有关Gson的更多信息here

    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public class A {
        public static final Type UNMARSHALLER_TYPE = new TypeToken<A>(){}.getType();
    
       @SerializedName("id")
       String id;
    
       @SerializedName("name")
       String name;
    
       @SerializedName("is_enabled")
       boolean isEnabled;
    }
    

    使用Jackson:您可以使用ObjectMapper,您可以找到有关Jackson的更多信息here

     @Test
    public void testAUnmarshaller() throws IOException {
        // given
       ObjectMapper objectMapper = new ObjectMapper();
        PapiSite payload = objectMapper.readValue(RESPONSE_JSON, A.class); 
    
        // then
        assertNotNull(payload);
        assertTrue(payload.isEnabled());
        assertEquals("XXX", payload.getName());
    }