Tag: jackson

Jackson序列化:将字段值设置为XML元素名称

我们使用Jackson jax-rs XML内容提供程序在我们基于jax-rs的REST API项目中处理XML内容类型。 在序列化POJO列表时,我们需要从POJO中的字段动态设置xml元素名称。 public class ResponsePOJO { @JacksonXmlProperty @JacksonXmlElementWrapper(useWrapping = false) private List message = new ArrayList(); } public class Message { private String type; // “Error” or “Warning” private String msg; // The actual message } 默认Jackson序列化XML: Error Some random error message Warning Some random warning message 我们的要求,即将类型设置为XML元素名称。 Some random error message […]

Java Jackson:反序列化复杂的多态对象模型:JsonMappingException:意外的令牌(START_OBJECT),预期的VALUE_STRING

我有这种物体树 一个 B延伸A. C延伸B D延伸B E延伸C. F扩展A并且对A有一个引用 A具有以下注释 @JsonTypeInfo(use=JsonTypeInfo.Id.CLASS,include=JsonTypeInfo.As.PROPERTY,property=”@class”) 如果我尝试反序列化扩展A的JSON对象数组,则会引发以下错误 org.codehaus.jackson.map.JsonMappingException:意外的标记(START_OBJECT),预期的VALUE_STRING:需要包含类型id的JSON字符串(对于java.util.Collection的子类型) json字符串由set的toString()方法生成,该set参数化为A类,其中A在JSON中序列化,代码如下: ObjectMapper objectMapper=new ObjectMapper(); objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_CONCRETE_AND_ARRAYS); String res=””; try { res = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(t); } catch (JsonGenerationException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return res; 反序列化json数组的代码(即上面描述的集合)是: ObjectMapper mapper = new ObjectMapper(); mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_CONCRETE_AND_ARRAYS); Collection results=null; try { […]

如何使JsonGenerator漂亮的日期和日期时间值?

我正在使用此方法将任何对象转换为json字符串: private String objectToJson(Object object) throws IOException { // write JSON StringWriter writer = new StringWriter(); ObjectMapper mapper = new ObjectMapper(); final JsonGenerator jsonGenerator = mapper.getJsonFactory().createJsonGenerator(writer); jsonGenerator.setPrettyPrinter(new DefaultPrettyPrinter()); mapper.writeValue(jsonGenerator, object); return writer.toString(); } 当正在打印的对象包含java.util.Date或jodatime的DateTime字段时,打印值是自纪元以来的毫秒数。 相反,我希望用标准的“HH:MM:SS”符号来打印它们。 我该怎么做呢?

使用JsonView将POJO转换为JsonNode

我正在编写一个典型的Play Framework应用程序,我希望使用Jackson从Controller的方法返回JsonNode。 这就是我现在正在做的事情: public static Result foo() { MyPojoType myPojo = new myPojo(); String tmp = new ObjectMapper().writerWithView(JSONViews.Public.class).writeValueAsString(myPojo); JsonNode jsonNode = Json.parse(tmp); return ok(jsonNode); } 是否可以避免“String tmp”副本并使用视图直接从MyPojoType转换为JsonNode? 也许我可以使用ObjectMapper.valueToTree,但我不知道如何为它指定一个JSonView。

jackson将额外的字段反序列化为地图

我希望将JSON对象中的任何未知字段反序列化为地图中的条目,该地图是pojo的成员。 例如json { “knownField” : 5, “unknownField1” : “926f7c2f-1ae2-426b-9f36-4ba042334b68”, “unknownField2” : “ed51e59d-a551-4cdc-be69-7d337162b691” } 和pojo class myObject{ int knownField; Map unknownFields; // getters/setters whatever } 有没有办法用jackson配置? 如果没有,是否有一种有效的方法来编写StdDeserializer来执行此操作(假设unknownFields的值可能是更复杂但众所周知的一致类型)?

jackson解析json与unwraping root,但没有能力设置@JsonRootName

rest服务回应 1243654INVOICE 或者在JSON中: {“transaction”:{“trxNumber”:1243654,”type”:”INVOICE”}} 使用时没有问题: mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true) 并由此产生的课程 @JsonRootName(“transaction”) public class Transaction { private String trxNumber; private String type; //getters and setters } 但实际上我应该使用第三方jar中的Transaction类,这与上面的完全相同, 但没有@JsonRootName(“transaction”)注释。 所以我最终得到了 Could not read JSON: Root name ‘transaction’ does not match expected (‘Transaction’) for type… 有没有办法强制Jackson解析到Transaction类而不向Transaction类本身添加任何东西(因为我把这个文件作为二进制jar的一部分)? 我尝试过自定义PropertyNamingStrategy,但似乎只能使用字段和getter / setter名称,而不是类名。 Java7,Jackson 2.0.5。 有什么建议么? 谢谢。

如何映射Mixins以嵌套JSON响应

我使用Jackson API将我的JSON响应映射到java对象 。 例如, 回复{name:’karthikeyan’,年龄:’24’,性别:’男’} @JsonProperty(“name”) public String _name; @JsonProperty(“age”) public int _age; @JsonProperty(“gender”) public String _gender; 是混合,它工作正常。(内部我们将映射这个pojo和混合)。 现在我如何在混合中表示以下响应? { name :’karthikeyan’, age:’24’, gender:’Male’, interest: { books:’xxx’, music:’yyy’, movie:’zzz’ } } 我试过以下,但没有运气。 @JsonProperty(“name”) public String _name; @JsonProperty(“age”) public int _age; @JsonProperty(“gender”) public String _gender; @JsonProperty(“interest”) public InterestPojo interestPojo; //created same format mix-in and pojo for […]

在Jackson的单个文件中反序列化来自多个YAML文档的POJO

我有一个YAML文件,看起来像这样: — name: Sam tags: – Dev – Java —- name: Bob tags: – PM 我想使用Jackson来反序列化文件中的所有文档,但是我没有看到使用普通ObjectMapper来实现它的方法。 如果我使用YAMLFactory为我的文件创建解析器,我可以遍历所有标记,因此解析器显然能够处理多个文档 – 但是如何将它们绑在一起? 看起来我的YAMLFactory创建的解析器只解析文件中的单个文档。 我还尝试直接创建YAMLParser并使用ObjectMapper#readValue(JsonParser, Class) ,但ObjectMapper耗尽整个YAMLParser来反序列化单个实例。

在写入File之前格式化JSON

目前我正在使用Jackson JSON处理器将偏好数据和文件等写入文件主要是因为我希望高级用户能够修改/备份这些数据。 Jackson非常棒,因为它非常容易使用,并且显然表现得很好(参见此处 ),但是我似乎唯一遇到的问题是当我运行myObjectMapper.writeValue(myFile, myJsonObjectNode)它会写入所有数据在ObjectNode中一行。 我想要做的是将JSON格式化为更加用户友好的格式。 例如,如果我将一个简单的json树传递给它,它将编写以下内容: {“testArray”:[1,2,3,{“testObject”:true}], “anotherObject”:{“A”:”b”,”C”:”d”}, “string1″:”i’m a string”, “int1”: 5092348315} 我希望它在文件中显示为: { “testArray”: [ 1, 2, 3, { “testObject”: true } ], “anotherObject”: { “A”: “b”, “C”: “d” }, “string1”: “i’m a string”, “int1”: 5092348315 } 是否有人知道我可以用jackson做到这一点的方法,或者我是否必须从jackson获取JSON字符串并使用另一个第三方lib来格式化它? 提前致谢!

Jackson多态性:如何将多个子类型映射到同一个类

我正在使用Jackson 1.9.x. 坚持动物的例子,这就是我想做的事情: 假设我有一个Animal类: public class Animal { private String type; // accessors } public class Mammal extends Animal { private String diet; // accessors } public class Bird extends Animal { private boolean tropical; // accessors } 我希望能够做到这样的事情(我将一些子类型映射到一个类,并将一些子类型映射到另一个类): @JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = “type”) @JsonSubTypes({@JsonSubTypes.Type(value = Mammal.class, name = “Dog”), @JsonSubTypes.Type(value […]