Tag: jackson

如何使用Java中的Streaming API解析JSON日志文件,然后输出列表日志文件

我有一个问题,我试图解析以JSON格式存储的大型日志文件,然后将数据列表并输出为另一个JSON文件。 以下是我正在解析的日志文件的格式: { “timestamp”: “2012-10-01TO1:00:00.000”, “id”: “someone@somewhere.net”, “action”: “Some_Action” “responsecode”: “1000” } 此处的操作是某些用户执行的操作,响应代码是该操作的结果。 时间戳和id实际上与我的制表无关,我只对动作/代码字段感兴趣。 在任何给定的日志文件中可能有成千上万的这些条目,我想要做的是跟踪所有类型的操作 , 响应代码及其各自的出现次数。 下面是我想要生成的输出示例。 {“actionName”: “Some_User_Action”, “responses”: [{“code”: “1000”, “count”: “36”}, {“code”: “1001”, “count”: “6”}, {“code”: “1002”, “count”: “3”}, {“code”: “1003”, “count”: “36”}, {“code”: “1004”, “count”: “2”}], “totalActionCount”: “83”} 所以基本上,对于每个Action,我想跟踪它生成的所有不同响应以及每个响应发生的次数。 最后,我想跟踪该行动的总回复总数。 目前,我已经为输出对象创建了一个Java类,我计划在其中存储输出数据。 我也对我应该存储响应数组的格式和它们各自的计数数字有点困惑。 响应代码类型的总数也因Action而异。 根据我的研究,我似乎需要使用Streaming API来使用JSON解析。 使用Streaming API的原因主要是由于使用非流API需要的内存开销量,这可能与这些日志文件的大小无法实现。 我目前正在考虑使用Jackson或GSON,但我无法找到任何具体的示例或教程来帮助我入门。 有没有人知道我可以学习的一个很好的例子,或者对我如何解决这个问题有任何暗示? 谢谢! […]

用spring反序列化JSON:未解析的前向引用Jackson Exception

我在Spring上使用API​​ Rest项目。 我有一个服务“CreateMateriel”,它作为参数数据JSON: 装备对象的JSON { “agence”: 1, “code”: “001”, “type”: “MyType” } “物质”与“Agence”有很多关系。 我把@JsonIdentityInfo标签用来使用Agence的Id而不是Agence的对象(看完这个话题后 ) @JsonIdentityInfo( generator = ObjectIdGenerators.PropertyGenerator.class, property = “idAgence”) @JsonIdentityReference(alwaysAsId = true) @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = “agence”) private Agence agence; 但是当我在POST / materiels上发送JSON时,我有这个例外: 2017-05-16 18:00:53.021 WARN 8080 — [nio-8080-exec-8] .wsmsDefaultHandlerExceptionResolver : Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: Could not read document: […]

jackson – 结合@JsonValue和@JsonSerialize

我正在尝试@JsonValue和@JsonSerialize的组合。 让我们从我当前的容器类开始: public class Container { private final Map data; @JsonValue @JsonSerialize(keyUsing = SomeKeySerializer.class) public Map data() { return data; } } 在这种情况下,不使用自定义序列化程序SomeKeySerializer 。 如果我按如下方式更改容器,则会调用序列化程序: public class Container { @JsonSerialize(keyUsing = SomeKeySerializer.class) private final Map data; } 但是,这不是我想要的,因为这会在输出JSON中引入另一个“数据”级别。 是否有可能以某种方式组合@JsonValue和@JsonSerialize ? 我总是可以为Container编写另一个自定义序列化程序,它或多或少与@JsonValue背后的function相同。 在我看来,这或多或少都是黑客攻击。 jackson版本:2.6.2

SpringMVC Jackson2HttpMessageConverter定制不起作用

我想使用自定义JsonSerializer来实现SpringMVC4的JSON响应。 为了添加JsonSerializer,我创建了WebMvcConfigurerAdapter子类。 但是MappingJackson2HttpMessageConverter的定制不起作用。 简化问题,我尝试了setJsonPrefix。 但它也没有用。 答复没有改变。 我的代码如下。 请告诉我有什么问题。 ControllerClass @Controller public class SampleController { @RequestMapping(“/sample”) @ResponseBody public ResponseModel action() { return new ResponseModel(); } public static class ResponseModel { public String id = “001”; public String text = “aaa”; } } 组态 @Configuration @EnableWebMvc public class WebMvcConfiguration extends WebMvcConfigurerAdapter { @Override public void configureMessageConverters(List<HttpMessageConverter> converters) […]

jackson解串器为通用类型

我需要为具有generics的类编写自定义反序列化器。 我找不到办法做到这一点,但我无法想象我是唯一有这个问题的人。 据我所知,有两种方法可以实现它,但它们都不是可实现的: 在反序列化器的构造函数中为反序列化器提供Class参数不起作用,因为在注册反序列化器时,Type.class与反序列化器实例之间的关系将丢失。 例如: public class Foo {} public class FooDeserializer { public FooDeserializer(Class type) { … } … } // Boilerplate code… module.addDeserializer(Foo.class, new FooDeserializer(Bar1.class)); module.addDeserializer(Foo.class, new FooDeserializer(Bar2.class)); 这不起作用,当ObjectMapper实例获取Foo的实例时,没有可用的generics参数的类型信息(类型擦除),因此它只选择最后注册的反序列化器。 在类中保留generics类型的引用没有帮助,因为类的实例化版本无法传递给反序列化器(接口是readValue(String,Class))。 例如: String json = “…”; ObjectMapper mapper = …; Foo foo = new Foo(Bar1.class); foo = mapper.readValue(json, Foo.class); // Can’t pass empty foo […]

Java对象用jackson将列表扩展到Json

我想使用Jackson将扩展列表的对象转换为Json。 例: public class TryToSerialize extends ArrayList { private int number; private String word; public TryToSerialize(){ number = 0; word = “”; } @JsonProperty public int getNumber() { return number; } public void setNumber(int number) { this.number = number; } @JsonProperty public String getWord() { return word; } public void setWord(String word) { this.word = […]

使用Jackson将Java对象实例编写到YAML

我有一个’示例’Pojo类,如下所述。 任何一个tel都可以使用Jackson将Example类的实例保存到YAML文件中。 public class Example { String name; int value; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getValue() { return value; } public void setValue(int value) { this.value = value; } }

使用Spring和Jackson JSON将java.io.Serializable实例序列化为JSON

我从一些内部API获取Serializable的实例。 Serializable实例实际上是Long或String等。有没有办法制作可以处理这种情况的DTO? 使用private Serializable value; JSON以value: {} 。 UPDATE 以下是相关代码的简化示例: @Controller public class SomeController { //… public MyDto getInfo(Long id) { MyDto result = new MyDto(); Serializable obj = svc.getInfo(id); // obj is either Long, or String, or one of few more fundamental Java types result.setValue(obj); return result; } } public class MyDto { private […]

在Jackson中将JsonNode序列化为非常特定的JSON格式

我有JsonNode结果,我想要打印出来。 到目前为止,我正在使用: ObjectMapper mapper = new ObjectMapper(); mapper.enable(SerializationFeature.INDENT_OUTPUT); File outputFile = new File( getCurOutputDir(), String.format(“out.json”, getClass().getSimpleName()) ); mapper.writeValue(new FileOutputStream(outputFile), resultNode); 输出如下: { “A” : [ { “Ai” : { “Ai1” : 42, “Ai2” : 55 } } ], “B” : [ 86 ] } 但我需要它采用这种特定的格式: { “A” : [ { “Ai” : { “Ai1” : […]

Spring Boot – RestController反序列化YAML上传?

如何配置Spring Boot RestController以接受YAML上传? 以下结果为415.我可以从调试中看到,我的Spring上下文中的MappingJackson2HttpMessageConverter实例仅支持[application/json;charset=UTF-8, application/*+json;charset=UTF-8] 。 我不能成为唯一一个尝试这样做的Spring Boot用户,我很惊讶它不仅仅起作用 – 大多数事情都是在Spring Boot中完成的! 我的POM中有YAML数据格式: com.fasterxml.jackson.dataformat jackson-dataformat-yaml 我的RestController有一个方法: @RequestMapping(method=RequestMethod.POST, value=”/”, consumes=”application/yaml”) public String upload(@RequestBody Declaration declaration) { //Do stuff } 我的测试: @Test public void triggersConvergence() throws Exception { ClassPathResource fixture = new ClassPathResource(“declaration.yml”); HttpHeaders requestHeaders = new HttpHeaders(); requestHeaders.add(“Content-Type”, “application/yaml”); requestHeaders.add(“Accept”, “application/json”); URI uri = new URI(“http://127.0.0.1:”+port); byte[] […]