`

Neo4j: custom parse string to POJO with jackson json

 
阅读更多

In my project, I provide neo4j extentions to clients which send json string to extention while  jackson auto parse the json string to my POJO Model.    Howerver, I want to simply the json string sent by client . 

The POJO Model class likes

@NodeEntity
@XmlRootElement
@JsonAutoDetect
@JsonIgnoreProperties(ignoreUnknown = true)
public class Task {
    @GraphId
    private Long nodeId;
    @Indexed(unique = true)
    private String taskId;

    @Indexed(indexType = IndexType.FULLTEXT, indexName = "TaskTile")
    private String title;
    @Indexed(indexType = IndexType.FULLTEXT, indexName = "TaskDescription")
    private String description;

    // Date startTime;
    // Date endTime;
    @Indexed
    private int startDate;
    @Indexed
    private int startTime;
    @Indexed
    private int endDate;
    @Indexed
    private int endTime;
---

 

The startDate, startTime,endDate,endTime adopted to search.  I dont' want client to explict send these fields in json strings but send by two Date string likes  yyyy-MM-dd HH:mm:ss   or Unix time 172399299999.

The valueble hints are

http://wiki.fasterxml.com/JacksonHowToCustomDeserializers

http://magicmonster.com/kb/prg/java/spring/webmvc/jackson_custom.html

 http://www.baeldung.com/jackson-deserialization

 

I did it by some post advices. But When I send some post,  Neo4j Jersey actually doesn't use jackson to parse the string.

I tried everything I could. Finally, I tried it out.

In pom.xml, We add

 		<dependency>
			<groupId>com.fasterxml.jackson.jaxrs</groupId>
			<artifactId>jackson-jaxrs-json-provider</artifactId>
			<version>2.2.1</version>
		</dependency>

 

In Model , We delete

@XmlRootElement

and Change Json related annotations to

com.fasterxml.jackson.databind.annotation.*

 not

org.codehaus.jackson.annotate.*

And The final Modle class is

import org.springframework.data.neo4j.annotation.GraphId;
import org.springframework.data.neo4j.annotation.Indexed;
import org.springframework.data.neo4j.annotation.Labels;
import org.springframework.data.neo4j.annotation.NodeEntity;
import org.springframework.data.neo4j.support.index.IndexType;

import com.fadeinfadeout.common.TaskDeserializer;
import com.fadeinfadeout.common.TaskPayOption;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;

@NodeEntity
@JsonDeserialize(using = TaskDeserializer.class )
public class Task {
    @GraphId
    private Long nodeId;
    @Indexed(unique = true)
    private String taskId;

 

The TaskDeserializer class is

package com.fadeinfadeout.common;

import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Logger;

import com.fadeinfadeout.modle.Task;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.TextNode;

public class TaskDeserializer extends JsonDeserializer<Task> {
    private static DateFormat dateFormator = new SimpleDateFormat("yyyyMMdd");
    private static DateFormat timeFormator = new SimpleDateFormat("HHmmss");
    private static final Logger logger = Logger.getLogger(TaskDeserializer.class.getName());
    @Override
    public Task deserialize(JsonParser jp, DeserializationContext dc) throws IOException, JsonProcessingException {
	JsonNode node = jp.getCodec().readTree(jp);
	String taskId = ((TextNode) node.get("taskId")).textValue();
	String title = ((TextNode) node.get("title")).textValue();
	String description = ((TextNode) node.get("description")).textValue();

	String startTimeStr = ((TextNode) node.get("start")).textValue(); // unix time
	String endTimeStr = ((TextNode) node.get("end")).textValue();

	if (startTimeStr != null & endTimeStr != null) {
	    Date sdate = new Date(Long.valueOf(startTimeStr));
	    Date edate = new Date(Long.valueOf(endTimeStr));
	    int startDate = Integer.valueOf(dateFormator.format(sdate));
	    int startTime = Integer.valueOf(timeFormator.format(sdate));

	    int endDate = Integer.valueOf(dateFormator.format(edate));
	    int endTime = Integer.valueOf(timeFormator.format(edate));
	    return new Task(taskId, title, description, startDate, startTime, endDate, endTime);
	}

	return new Task(taskId, title, description);
    }
  
}

 

When post a request with

curl -i -H 'content-type: application/json' -X POST 
-d '{"taskId":"3","title":"打炮","description":"约吗",
"start":"1427965098585","end":"1427965598585"}' 
http://localhost:7474/fifo/task/addTask

 

The deserilizer result is correct



 

 

 

Due to the following posts, I could solve this problem.

http://www.4byte.cn/question/601051/unmanaged-extensions-taking-json-as-parameter.html

https://github.com/FasterXML/jackson-annotations/wiki/Jackson-Annotations

 

 

 

 

 

 

------------------------------------

The other coin of the above problem is custom serialize POJO Model to Json string

http://java.dzone.com/articles/how-serialize-javautildate

http://wiki.fasterxml.com/JacksonSampleDateHandling

 

 

 

 

References

https://jersey.java.net/nonav/documentation/latest/media.html

http://wiki.fasterxml.com/JacksonHowToCustomSerializers

http://magicmonster.com/kb/prg/java/spring/webmvc/jackson_custom.html

http://wiki.fasterxml.com/JacksonHome

http://wiki.fasterxml.com/JacksonSampleSimplePojoMapper

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 大小: 17.9 KB
分享到:
评论

相关推荐

    vue-neo4j:vue使用D3对neo4 j进行可视化-源码开发技术-其它

    Neo4j Vue 安装步骤 克隆或下载该库到本地 下载neo4j并安装到本地,启动neo4j服务 进入到该工程的根目录,输入命令:npm run update进行npm包的导入 使用命令:npm run dev启动该工程 默认端口是:8081 neo4j账号...

    vue-neo4j:vue使用D3对neo4j进行可视化源码开发技术-其它

    Neo4j Vue 安装步骤 克隆或下载该库到本地 下载neo4j并安装到本地,启动neo4j服务 进入到该工程的根目录,输入命令:npm run update进行npm包的导入 使用命令:npm run dev启动该工程 默认端口是:8081 neo4j账号...

    movies-java-spring-data-neo4j:使用Spring Data Neo4j的Neo4j电影示例

    电影示例应用 如何一起使用Spring Boot,Spring Data和Neo4j。 Spring Data Neo4j可以在基于Spring的应用程序中方便地集成Neo4j。 它提供了对象图映射(OGM)功能以及Spring Data项目共有的其他功能。 笔记该项目...

    neo4j-jdbc:带有BOLT协议的Neo4j 3.x的Neo4j JDBC驱动程序

    该驱动程序支持各种类型的数据库传输: 通过使用jdbc:neo4j:bolt://&lt;host&gt;:&lt;port&gt;/的Bolt协议(3.0.x至3.2.x) 通过使用jdbc:neo4j:http://&lt;host&gt;:&lt;port&gt;/的HTTP协议(2.x +) 展望未来,还将支持: 直接文件连接...

    sails-restful-neo4j:SailsWaterline RESTful Neo4j 适配器

    connections = { default : 'restful-neo4j' , restful - neo4j : { module : 'sails-restful-neo4j' , type : 'json' , // expected response type (json | string | http) host : 'foo.myneo4j.com' , //

    vue-neo4j:vue使用D3对neo4j进行可视化

    Neo4j Vue安装步骤克隆或下载该库到本地下载neo4j并安装到本地,启动neo4j服务进入到该工程的根目录,输入命令:npm run update进行npm包的导入使用命令:npm run dev启动该工程默认端口是:8081 neo4j账号信息: ...

    bitnami-docker-neo4j:Neo4j的Bitnami Docker映像

    DR $ docker run --name neo4j bitnami/neo4j:latestDocker撰写$ curl -sSL https://raw.githubusercontent.com/bitnami/bitnami-docker-neo4j/master/docker-compose.yml &gt; docker-compose.yml$ docker-compose up...

    neo4j-community-3.5.12-windows.zip

    **Neo4J社区版3.5.12 Windows安装与使用指南** Neo4J是一款流行的图数据库管理系统,尤其适用于处理复杂关系数据。图数据库利用图形结构来存储和查询数据,其核心理念是节点、边(关系)和属性,这使得在处理网络、...

    email2neo4j:使用一个简单的命令将您的电子邮件导入图表

    imap2neo4j: imap2neo4j imapServer imapUsername imapPassword imapMailbox neo4jServer [neo4jUsername] [neo4jPassword] [paging, eg import by batches of 1000] [specific range of messages, eg 50

    Nested-Class-Models-Rest-Api-Neo4j:在休息环境中作为 neo4j 扩展实现的嵌套类模型

    通过在 conf/neo4j-server.properties 中添加一行来配置 Neo4j: org.neo4j.server.thirdparty_jaxrs_classes=org.neo4j.example.unmanagedextension=/example 启动 Neo4j 服务器。 写评论 curl ...

    Sublime-Neo4j:用于运行 Neo4j Cypher 查询的 Sublime 插件

    Sublime Text 2/3 插件:Neo4j Sublime 是最好的跨平台编辑器之一,所以我想为什么不创建一个简单的 Neo4j 插件呢?... 编辑用户名和密码(默认为neo4j:neo) 结果显示在控制台中(Ctrl+~)打开C

    egg-neo4j:Neo4j鸡蛋插件

    egg-neo4j Neo4j用于鸡蛋框架。安装$ npm i egg-neo4j --save用法// {app_root}/config/plugin.jsexports . neo4j = { enable : true , package : 'egg-neo4j' ,} ;配置// {app_root}/config/config.default....

    nodejs-on-neo4j:Neo4j上的NodeJS的简单PoC

    **Node.js on Neo4j: 在图形数据库上构建应用** 标题中的"nodejs-on-neo4j"指的是一项使用Node.js与Neo4j图形数据库交互的实践项目。这个项目通常涉及利用Node.js的灵活性和Neo4j的强大图数据处理能力来开发应用...

    schemaless-graphql-neo4j:将无类型和动态GraphQL查询转换为Cypher

    schemaless-graphql-neo4j 将无类型的动态GraphQL查询转换为Cypher。 签出,以更好地查看您可以编写的查询。入门$ npm install schemaless-graphql-neo4j :warning: 图书馆尚未发布操场您可以开始使用开发人员游乐场...

    Laravel开发-neo4j-php-ogm

    'Neo4j' =&gt; Neo4j\OGM\Facades\Neo4j::class, ], ``` 5. **配置服务**:在`app/Providers/AppServiceProvider.php`的`boot`方法中加载配置文件和启动Neo4j客户端: ```php public function boot() { $this-&gt;app-&gt;...

    Beginning.Neo4j.1484212

    This book will take you from the installation of Neo4j through to building a full application with Neo4j at its heart, and everything in between. Using this book, you'll get everything up and ...

    neo4j:所有人的图表

    【标题】"neo4j:所有人的图表"指的是开源图数据库管理系统Neo4j,它将数据以图形结构的形式存储和处理,便于理解复杂的关系。在信息化时代,数据之间的关联性日益增强,图数据库如Neo4j应运而生,成为理解和分析...

    linkedin_to_neo4j:Linkedin_to_neo4j

    为什么这个 ? 您可能需要对您的linkedin 网络进行分析/监控。 我个人使用它来更好地可视化我的网络并对其进行一些数据分析。如何使用您必须通过在其中创建应用程序来设置您的 linkedin API 密钥 git clone ...

    spring-graph-neo4j:Neo4j的春天

    标题中的“spring-graph-neo4j:Neo4j的春天”暗示了我们将探讨Spring框架与图数据库Neo4j的结合使用。在Java开发领域,Spring框架是一个广泛使用的开源框架,它提供了一整套用于构建企业级应用的服务和工具。而Neo4j...

    docker-neo4j:运行 Neo4j 容器的镜像

    Neo4j Neo4j 是一个高度可扩展、健壮(完全 ACID)的原生图形数据库。 Neo4j 被全球数以千计的领先企业、初创公司、企业和政府用于任务关键型应用程序。 使用存储库上的 Dockerfile,您就可以使用 docker neo4j ...

Global site tag (gtag.js) - Google Analytics