ser*_*nni 19 java json jackson deserialization
发送的JSON:
{
"Banner": "ABC"
}
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
控制器:
@RequestMapping(value = {"/GetBanner"}, method = RequestMethod.POST)
@ResponseBody
public ResponseEntity<String> enrollCustomer(@RequestBody BannerData body, HttpServletRequest request) throws Exception {
...
}
Run Code Online (Sandbox Code Playgroud)
请求/GetBanner返回:
客户端发送的请求在语法上是不正确的.
工程确定当JSON变更为(小写字母命名的就是Java字段名):
{
"banner": "ABC"
}
Run Code Online (Sandbox Code Playgroud)
但是我需要在JSON中使用大写字段命名.
看起来不起作用.@JsonProperty(value = "Banner")
这是正确的映射吗?
Art*_*ich 13
也许你只是试着:
@JsonProperty("Banner")
Run Code Online (Sandbox Code Playgroud)
没有'value ='.我在我的项目中使用它,它实际上按预期工作.
UPDATE
我刚刚创建了一些测试类来测试你的问题的行为.我做了什么:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
另一个读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);
}
}
Run Code Online (Sandbox Code Playgroud)
最后是入口点类:
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());
}
}
Run Code Online (Sandbox Code Playgroud)
打印:
ABC
Run Code Online (Sandbox Code Playgroud)
使用依赖:
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
json文件:
{
"Banner": "ABC"
}
Run Code Online (Sandbox Code Playgroud)
更新2
虽然上述代码不适合您,但请尝试添加
@JsonProperty("Banner")
Run Code Online (Sandbox Code Playgroud)
不仅是私有变量,还有getter/setter对,如:
@JsonProperty("Banner")
private String banner;
@JsonProperty("Banner")
public String getBanner() {
return banner;
}
@JsonProperty("Banner")
public void setBanner(String banner) {
this.banner = banner;
}
Run Code Online (Sandbox Code Playgroud)
我建议下面; (如果您使用的是ObjectMapper)
一旦获得了ObjectMapper,就可以使用PascalCase设置PropertyNamingStrategy.这是文档的链接
ObjectMapper mapper = new ObjectMapper();
mapper.setPropertyNamingStrategy(
PropertyNamingStrategy.PascalCaseStrategy);
Run Code Online (Sandbox Code Playgroud)
如果你不使用ObjectMapper-然后标注您BannerData带班@JsonNaming像below--
@JsonNaming(PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy.class)
public class BannerData implements java.io.Serializable {
Run Code Online (Sandbox Code Playgroud)
我在github找到了@JsonNaming
| 归档时间: |
|
| 查看次数: |
15602 次 |
| 最近记录: |