我有以下两个班级:
@JsonIgnoreProperties(ignoreUnknown = true)
public class ChangesJSON {
@JsonProperty("changes")
List<ChangeJSON> changes;
@JsonProperty("more")
Boolean more;
}
public class ChangeJSON {
@JsonProperty("epoch")
Long epoch;
@JsonProperty("payload")
Map<String, Object> payload;
}
Run Code Online (Sandbox Code Playgroud)
当我尝试使用此测试反序列化时:
String test = "{\"changes\":[{\"epoch\":1441556306522,\"payload\":\"{\"to\":1}\"},{\"epoch\":1441555481524,\"payload\":\"{\"to\":-1}\"}],\"more\":false}";
@Test
public void myTest() {
ObjectMapper mapper = new ObjectMapper();
ChangesJSON result = null;
try {
result = mapper.readValue(test, ChangesJSON.class);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
assertNotNull(result);
}
Run Code Online (Sandbox Code Playgroud)
我得到以下异常:
com.fasterxml.jackson.databind.JsonMappingException:无法从String值('{')实例化java.util.LinkedHashMap类型的值; [Source:{"changes":[{"epoch":1441556306522,"payload":"{"to":1}"},{"epoch":1441555481524,"payload"中没有单字符串构造函数/工厂方法: "{" 到 ": - 1}"}], "更多":假}; line:1,column:35](通过引用链:demo.ChangesJSON ["changes"] - > java.util.ArrayList …
我有一个枚举定义为
public enum Locale {
EN_US, ES_MX
}
Run Code Online (Sandbox Code Playgroud)
但是,这些语言环境被写为带有连字符的小写字符串en-us和es-mx数据.
有没有办法将这些小写字符串映射到相应的枚举常量?像en-us到EN_US?
编辑 让我提供更多信息.我有以下课程的对象.
public class Song {
private Map<Locale, String> songName;
private int durationMillis;
}
Run Code Online (Sandbox Code Playgroud)
歌曲的名称可能因Locale而异.所以我在各种Locales中创建了一个歌曲名称的地图.
我有一个包含歌曲信息的JSON文件.它读起来像:
{
"songs": [
{
"songName": {"en-us":"Song name in US english", "es-mx": "Song name in Spanish"},
"durationMillis": 100000
},
{
"songName": {"en-us": "another song name - English"},
"durationMillis": 200000
}
]
}
Run Code Online (Sandbox Code Playgroud)
我定义了另一个类.
public class Songs {
private Set<Song> songs;
}
Run Code Online (Sandbox Code Playgroud)
我使用FasterXml ObjectMapper来加载JSON作为Songs类的对象.
Songs …Run Code Online (Sandbox Code Playgroud) 我有下面的 ObjectNode。
handlerObjectNode -> {"Info":{"Brand":{"BrandName":"TOP OF THE WORLD"}}}
Run Code Online (Sandbox Code Playgroud)
我有另一个以下格式的 ObjectNode。
fieldObjects -> {"Description":"REGULAR BR"}
Run Code Online (Sandbox Code Playgroud)
如何从上面两个创建下面的 ObjectNode?
{
"Info": {
"Brand": {
"BrandName": "TOP OF THE WORLD"
}
"Description": "REGULAR BR"
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试了下面的代码。
handlerObjectNode.setAll(fieldObjects);
Run Code Online (Sandbox Code Playgroud)
但它会产生以下 ObjectNode。
{
"Info": {
"Brand": {
"BrandName": "TOP OF THE WORLD"
}
},
"Description": "REGULAR BR"
}
Run Code Online (Sandbox Code Playgroud)
我正在使用 Jackson 的 com.fasterxml.jackson.databind.node.ObjectNode 。任何帮助将非常感激。
验证在 Spring Boot 中传递到 GET REST 控制器的复杂 JSON 对象的最简单方法是什么,我正在使用com.fasterxml.jackson.databind.ObjectMapper 进行映射?
这是控制器:
@RestController
@RequestMapping("/products")
public class ProductsController {
@GetMapping
public ProductResponse getProducts(
@RequestParam(value = "params") String requestItem
) throws IOException {
final ProductRequest productRequest =
new ObjectMapper()
.readValue(requestItem, ProductRequest.class);
return productRetriever.getProductEarliestAvailabilities(productRequest);
}}
Run Code Online (Sandbox Code Playgroud)
我要验证的 DTO 请求对象:
public class ProductRequest {
private String productId;
public String getProductId() {
return productId;
}
public void setProductId(String productId) {
this.productId = productId;
}}
Run Code Online (Sandbox Code Playgroud)
我正在考虑在请求 DTO 上使用注释,但是当我这样做时,它们不会触发任何类型的异常,即@NotNull。我试着使用不同组合@Validated在控制器以及@Valid在@RequestParam并没有什么原因造成的验证来触发。
我想从下面的 json 中提取“msg”值fasterxml.jackson- 谁能建议我我的模型类应该是什么样子?
{
"statusCode": 422,
"error": "Unprocessable Entity",
"message": "Bad data received",
"err_data": {
"payment_details.type": {
"location": "body",
"param": "payment_details.type",
"msg": "Must be either etransfer or cheque"
}
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我所做的,但它总是返回 "null" !
@JsonInclude(JsonInclude.Include.ALWAYS)
public class MyApiResponse extends ParentResponse implements Serializable {
private static final long serialVersionUID = 1L;
@JsonProperty("payment_details")
private PaymentDetails payment_details;
@JsonProperty("payment_details")
public PaymentDetails getPayment_details() {
return payment_details;
}
@JsonProperty("payment_details")
public void setPayment_details(PaymentDetails payment_details) {
this.payment_details = payment_details;
}
}
Run Code Online (Sandbox Code Playgroud)
ParentResponse模型类扩展了ErrorResponse模型类,这就是它的样子.. …
当我在 DTO 中有一个字节数组并使用 jackson's 将其转换为 json 时ObjectMapper,它会自动将字节数组转换为 base64 字符串。下面举例。
@Data
@AllArgsConstructor
class TestDTO {
private byte[] binaryFile;
}
class TestByteSerialization {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
byte[] bytes = Files.readAllBytes(new File("path/to/file/test.pdf").toPath());
TestDTO dto = new TestDTO(bytes);
String json = objectMapper.writeValueAsString(dto);
System.out.println(json);
}
}
Run Code Online (Sandbox Code Playgroud)
我希望 jackson 将其转换为如下所示的整数数组:
{
"binaryFile" : [21, 45, 12, 65, 12 ,37, etc]
}
Run Code Online (Sandbox Code Playgroud)
但是相反,我发现它被转换为 base64 字符串。经过一番研究,似乎 json 不支持这里提到的字节数组。这是有道理的,因为 json 是数据的字符串表示形式。
但是我仍然找不到为什么json不支持字节数组的答案?它仍然只是一个数字数组,对吗?需要将其转换为 base64 编码的字符串吗?将字节数组按原样传递给 json …
我正在使用 Jackson Json Parser 从 JSON 字符串中获取值,然后将它们插入到 Java 对象中。这是我正在处理的 JSON 的一部分:
{
"address":"aURL",
"links":[
"aURL",
"aURL",
"aURL"
]
}
Run Code Online (Sandbox Code Playgroud)
这是我的 Java 代码中发生的事情。net 是一个全局的 ArrayList,Page 对象有一个 String 地址字段和一个 String[] links 字段。我想从 JSON 中获取链接的字符串数组并将它们插入到 Page 对象中。虽然我可以使用 getText() 方法轻松提取地址字符串,但我无法找到一种便捷的方法来获取字符串数组。这是我现在的代码:
private static void parse(String json) throws IOException {
JsonParser parser = new JsonFactory().createJsonParser(json);
while (parser.nextToken() != JsonToken.END_OBJECT) {
String tok = parser.getCurrentName();
Page p = new Page();
if ("address".equals(tok)) {
parser.nextToken();
p.setAddress(parser.getText());
}
if ("links".equals(tok)) {
parser.nextToken();
//p.setLinks(HOW TO GET STRING ARRAY)
}
net.add(p); …Run Code Online (Sandbox Code Playgroud) 我有一个具有字段的模型类:
@JsonDeserialize(using = InstantDeserializer.class)
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
private OffsetDateTime offsetDt;
Run Code Online (Sandbox Code Playgroud)
当这个模型的请求发送到服务器时,我的控制器抛出异常:
Caused by: java.lang.IllegalArgumentException:
Class com.fasterxml.jackson.datatype.jsr310.deser.InstantDeserializer
has no default (no arg) constructor
Run Code Online (Sandbox Code Playgroud)
pom.xml 具有 2.8.11 版本的依赖项:
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)
我知道这是由 @JsonDeserialize 需要无参数构造函数引起的,但是有解决方法吗?非常感谢。
当我将 Spring Boot 应用程序从 2.4.1 升级到 2.6.1 时。我收到以下错误。
com.fasterxml.jackson.databind.exc.InvalidDefinitionException:
java.time.Instant默认情况下不支持 Java 8 日期/时间类型:添加模块“com.fasterxml.jackson.datatype:jackson-datatype-jsr310”以启用处理(通过引用链:org. springframework.boot.actuate.trace.http.HttpTrace[“时间戳”])
我在升级到 spring 6 时面临无法访问 javax.ws.rs.ext.MessageBodyReader 的问题。我在 spring 6 应用程序和 com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider 2.14 中使用 glassfish jersey 3.1.0 作为 REST 服务.1.
我在调用 JacksonJsonProvider.setMapper() 时遇到此编译错误
我不知道如何解决这个问题。
fasterxml ×10
jackson ×8
java ×8
json ×6
spring ×3
spring-boot ×2
data-binding ×1
enums ×1
glassfish ×1
jersey ×1
jsr310 ×1
parsing ×1
rest ×1
rest-assured ×1