JSON Java 模型的字段映射
JSON field mapping for Java model
发送的JSON:
{
"Banner": "ABC"
}
Java 型号:
...
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
public class BannerData implements java.io.Serializable {
private static final long serialVersionUID = 5664846645733319592L;
@JsonProperty(value = "Banner")
private String banner;
public String getBanner() {
return banner;
}
public void setBanner(String banner) {
this.banner = banner;
}
}
控制器:
@RequestMapping(value = {"/GetBanner"}, method = RequestMethod.POST)
@ResponseBody
public ResponseEntity<String> enrollCustomer(@RequestBody BannerData body, HttpServletRequest request) throws Exception {
...
}
请求 /GetBanner
returns:
客户端发送的请求在语法上不正确。
工作正常 当 json 更改为(小写命名 Java 字段名称):
{
"banner": "ABC"
}
但是我需要大写字段命名JSON.
看起来 @JsonProperty(value = "Banner")
不起作用。
映射正确吗?
在 getter
上试用
@JsonProperty(value = "Banner")
public String getBanner() {
编辑:
向我们展示您的 Spring 配置文件。你真的在使用杰克逊吗?参见 http://www.journaldev.com/2552/spring-restful-web-service-example-with-json-jackson-and-client-program
<!-- Configure to plugin JSON as request and response in method handler -->
<beans:bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<beans:property name="messageConverters">
<beans:list>
<beans:ref bean="jsonMessageConverter"/>
</beans:list>
</beans:property>
</beans:bean>
<!-- Configure bean to convert JSON to POJO and vice versa -->
<beans:bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
</beans:bean>
编辑 2
由于您可能会或可能不会使用 Jackson...请尝试一些其他注释
@XmlElement(name="Banner")
可能来自 GSON
@SerializedName("Banner")
您是否尝试过将您的 jackson 从 1.9.13 更新到 2.5.4(它有另一个工件组 ID - com.fasterxml.jackson)
此代码是否适合您?
ObjectMapper mapper = new ObjectMapper();
BannerData bannerData = mapper.readValue("{ \"Banner\": \"ABC\"}", BannerData.class);
对我来说效果很好(如果我用 "banner" 替换 "Banner" - 得到错误的对象 "banner" 空字段。)
此代码也很有用:
System.out.println(mapper.getDeserializationConfig().getPropertyNamingStrategy());
属性 命名策略可能有问题 - 如果您使用自定义命名策略。
也许你只是尝试:
@JsonProperty("Banner")
没有'value ='。我在我的项目中使用它,它确实按预期工作。
更新
我刚刚创建了一些测试 classes 来测试你的问题的行为。我做了什么:
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
import org.codehaus.jackson.annotate.JsonProperty;
import org.codehaus.jackson.map.annotate.JsonSerialize;
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
public class BannerData implements java.io.Serializable {
private static final long serialVersionUID = 5664846645733319592L;
@JsonProperty("Banner")
private String banner;
public String getBanner() {
return banner;
}
public void setBanner(String banner) {
this.banner = banner;
}
}
另class阅读json:
import org.codehaus.jackson.map.ObjectMapper;
import java.io.File;
import java.io.IOException;
public class BannerReader {
private static final String JSON_PATH = "pathToYourJson";
public BannerData readBanner() throws IOException {
ObjectMapper mapper = new ObjectMapper();
return mapper.readValue(new File(JSON_PATH), BannerData.class);
}
}
最后是入口点class:
import java.io.IOException;
public class BannerTest {
public static void main(String[] args) throws IOException {
BannerReader reader = new BannerReader();
BannerData bannerData = reader.readBanner();
System.out.println(bannerData.getBanner());
}
}
打印:
ABC
使用的依赖项:
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
json 文件:
{
"Banner": "ABC"
}
更新 2
虽然上面的代码不适合你,尝试添加
@JsonProperty("Banner")
不仅是私有变量,还有getter/setter对,比如:
@JsonProperty("Banner")
private String banner;
@JsonProperty("Banner")
public String getBanner() {
return banner;
}
@JsonProperty("Banner")
public void setBanner(String banner) {
this.banner = banner;
}
我会在下面提出建议; (如果您使用的是 ObjectMapper)
获得 ObjectMapper 后,您可以使用 PascalCase 设置 PropertyNamingStrategy。 this is link for documentation
ObjectMapper mapper = new ObjectMapper();
mapper.setPropertyNamingStrategy(
PropertyNamingStrategy.PascalCaseStrategy);
如果您没有使用 ObjectMapper- 然后用 @JsonNaming
注释您的 BannerData
class,如下所示 --
@JsonNaming(PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy.class)
public class BannerData implements java.io.Serializable {
我发现@JsonNaming here in github
JSON:
{
"Banner": "ABC"
}
Java 型号:
...
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
public class BannerData implements java.io.Serializable {
private static final long serialVersionUID = 5664846645733319592L;
@JsonProperty(value = "Banner")
private String banner;
public String getBanner() {
return banner;
}
public void setBanner(String banner) {
this.banner = banner;
}
}
控制器:
@RequestMapping(value = {"/GetBanner"}, method = RequestMethod.POST)
@ResponseBody
public ResponseEntity<String> enrollCustomer(@RequestBody BannerData body, HttpServletRequest request) throws Exception {
...
}
请求 /GetBanner
returns:
客户端发送的请求在语法上不正确。
工作正常 当 json 更改为(小写命名 Java 字段名称):
{
"banner": "ABC"
}
但是我需要大写字段命名JSON.
看起来 @JsonProperty(value = "Banner")
不起作用。
映射正确吗?
在 getter
上试用@JsonProperty(value = "Banner")
public String getBanner() {
编辑:
向我们展示您的 Spring 配置文件。你真的在使用杰克逊吗?参见 http://www.journaldev.com/2552/spring-restful-web-service-example-with-json-jackson-and-client-program
<!-- Configure to plugin JSON as request and response in method handler -->
<beans:bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<beans:property name="messageConverters">
<beans:list>
<beans:ref bean="jsonMessageConverter"/>
</beans:list>
</beans:property>
</beans:bean>
<!-- Configure bean to convert JSON to POJO and vice versa -->
<beans:bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
</beans:bean>
编辑 2
由于您可能会或可能不会使用 Jackson...请尝试一些其他注释
@XmlElement(name="Banner")
可能来自 GSON
@SerializedName("Banner")
您是否尝试过将您的 jackson 从 1.9.13 更新到 2.5.4(它有另一个工件组 ID - com.fasterxml.jackson)
此代码是否适合您?
ObjectMapper mapper = new ObjectMapper();
BannerData bannerData = mapper.readValue("{ \"Banner\": \"ABC\"}", BannerData.class);
对我来说效果很好(如果我用 "banner" 替换 "Banner" - 得到错误的对象 "banner" 空字段。)
此代码也很有用:
System.out.println(mapper.getDeserializationConfig().getPropertyNamingStrategy());
属性 命名策略可能有问题 - 如果您使用自定义命名策略。
也许你只是尝试:
@JsonProperty("Banner")
没有'value ='。我在我的项目中使用它,它确实按预期工作。
更新
我刚刚创建了一些测试 classes 来测试你的问题的行为。我做了什么:
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
import org.codehaus.jackson.annotate.JsonProperty;
import org.codehaus.jackson.map.annotate.JsonSerialize;
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
public class BannerData implements java.io.Serializable {
private static final long serialVersionUID = 5664846645733319592L;
@JsonProperty("Banner")
private String banner;
public String getBanner() {
return banner;
}
public void setBanner(String banner) {
this.banner = banner;
}
}
另class阅读json:
import org.codehaus.jackson.map.ObjectMapper;
import java.io.File;
import java.io.IOException;
public class BannerReader {
private static final String JSON_PATH = "pathToYourJson";
public BannerData readBanner() throws IOException {
ObjectMapper mapper = new ObjectMapper();
return mapper.readValue(new File(JSON_PATH), BannerData.class);
}
}
最后是入口点class:
import java.io.IOException;
public class BannerTest {
public static void main(String[] args) throws IOException {
BannerReader reader = new BannerReader();
BannerData bannerData = reader.readBanner();
System.out.println(bannerData.getBanner());
}
}
打印:
ABC
使用的依赖项:
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
json 文件:
{
"Banner": "ABC"
}
更新 2
虽然上面的代码不适合你,尝试添加
@JsonProperty("Banner")
不仅是私有变量,还有getter/setter对,比如:
@JsonProperty("Banner")
private String banner;
@JsonProperty("Banner")
public String getBanner() {
return banner;
}
@JsonProperty("Banner")
public void setBanner(String banner) {
this.banner = banner;
}
我会在下面提出建议; (如果您使用的是 ObjectMapper)
获得 ObjectMapper 后,您可以使用 PascalCase 设置 PropertyNamingStrategy。 this is link for documentation
ObjectMapper mapper = new ObjectMapper();
mapper.setPropertyNamingStrategy(
PropertyNamingStrategy.PascalCaseStrategy);
如果您没有使用 ObjectMapper- 然后用 @JsonNaming
注释您的 BannerData
class,如下所示 --
@JsonNaming(PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy.class)
public class BannerData implements java.io.Serializable {
我发现@JsonNaming here in github