`

eclipselink,MOXy,JAXB,Json工具类

    博客分类:
  • java
阅读更多
  • 从String中转成JSON对象
    最近使用json来传递对象,JAXB,基于JAVA annotation,因此代码简洁,所以选用支持JAXB的MOXy,以前一直用google Gson,这个适合手动解析JSON,它在一些很大的JSON对象上速度很快,但是不利于快速开发,且维护复杂,代码不友好。

Gson中的fromJson 方法也可以解析简单对象,如{"type":0,"score":0.0}。但复杂对象,包含数组,内嵌其他对象,我没有成功。

第一次使用MOXy,版本2.5.0,解析JSON出错:

MOXy deserialization exception: A descriptor with default root element was not found in the project

 

网上查了下,statckoverflow的

http://stackoverflow.com/questions/14246033/moxy-deserialization-exception-a-descriptor-with-default-root-element-was-not-f

上面说是没有指定root属性:

public static <T>T fromJson(StreamSource streamSource, Class<?> cls, boolean hasRoot)

throws JAXBException, ClassCastException {

Map<String, Object> properties = new HashMap<String, Object>(2);

properties.put(JAXBContextProperties.MEDIA_TYPE, "application/json");

properties.put(JAXBContextProperties.JSON_INCLUDE_ROOT, hasRoot);//---->这个需要设为false

.createContext(new Class[] { cls }, properties);

Unmarshaller un = jc.createUnmarshaller();

JAXBElement<T> elem = (JAXBElement<T>) un.unmarshal(streamSource,cls);//-->当JSON不含root时,必须指定cls类型。所以,这里必须要用StreamSource,而不能直接用reader,否则没法指定cls类型。

return  (T)(elem.getValue());

 

}

import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.transform.stream.StreamSource;

import org.eclipse.persistence.jaxb.JAXBContextProperties;

public class DtoUtil {
	@SuppressWarnings("unchecked")
	public static <T>T fromJson(StreamSource streamSource, Class<?> cls, boolean hasRoot)
			throws JAXBException, ClassCastException {
		Map<String, Object> properties = new HashMap<String, Object>(2);
		properties.put(JAXBContextProperties.MEDIA_TYPE, "application/json");
		properties.put(JAXBContextProperties.JSON_INCLUDE_ROOT, hasRoot);
		JAXBContext jc = org.eclipse.persistence.jaxb.JAXBContextFactory
				.createContext(new Class[] { cls }, properties);
		Unmarshaller un = jc.createUnmarshaller();
		JAXBElement<T> elem = (JAXBElement<T>) un.unmarshal(streamSource,cls);
		return  (T)(elem.getValue());
	}
	public static <T> String toJson(T obj,Class<?>cls,boolean hasRoot) throws JAXBException,
			ClassCastException {
		Map<String, Object> properties = new HashMap<String, Object>(2);
		properties.put(JAXBContextProperties.MEDIA_TYPE, "application/json");
		properties.put(JAXBContextProperties.JSON_INCLUDE_ROOT, hasRoot);
		JAXBContext jc = org.eclipse.persistence.jaxb.JAXBContextFactory
				.createContext(new Class[] { cls }, properties);
		Marshaller marshaller = jc.createMarshaller();
		StringWriter writer = new StringWriter();
		marshaller.marshal(obj, writer);
		return writer.toString();
	}
}

 

 

maven dependency:

<dependency>

<groupId>org.eclipse.persistence</groupId>

<artifactId>eclipselink</artifactId>

<version>2.5.0</version>

</dependency>

 

用法,如:

DtoUtil.fromJson(new StreamSource(reader), cls, hasRoot);

DtoUtil.toJson(obj, cls, hasRoot);

 

分享到:
评论

相关推荐

    JAXB的 eclipse插件

    总结一下,JAXB的Eclipse插件是Java开发者处理XML数据的强大工具,它集成了XML Schema与Java类的相互转换、源代码编辑支持以及调试等功能。通过利用这些插件,开发者可以更加高效地进行XML相关的开发工作,实现Java...

    eclipselink的英文文档

    - **主要特性**:涵盖了EclipseLink的特性概览,如其支持的JPA 2.1组件、JAXB、MOXy、SDO组件等。 - **关键组件**:EclipseLink提供了一系列核心API和组件,以支持对象关系映射和Web服务等需求。 - **性能监控和分析...

    eclipselink.jar

    下载eclipselink.jar,这个jar包版本2.5.2,下载eclipselink.jar

    导入eclipse的json包

    为了在Java环境中处理JSON数据,我们需要一个支持JSON的库,比如`org.json`包,它是Eclipse IDE中的一个常用工具。 标题“导入eclipse的json包”意味着我们将讨论如何将`org.json`包导入到Eclipse项目中,以便在...

    eclipselink+jobss EAP6.2集成module

    在JBOSS EAP 6.2中集成EclipseLink的module,首先需要确保EclipseLink库被添加到应用服务器的类路径中。这通常通过将EclipseLink的JAR文件放入JBOSS EAP的`modules`目录下的相应模块路径来完成。例如,创建一个新的...

    eclipse-jaxb:Eclipse Java11 JAXB OSGI

    eclipse-jaxb 2021年3月20日,星期六 已经有很多关于如何使JAXB与Java11和OSGI平台(如Eclipse)一起使用的文章。对于Java8,JAXB(Java XML绑定)API和实现是Java平台和“标准”的一部分。使用Java9时,不建议将其...

    eclipselink doc文档

    eclipselink 1.0 doc 文档

    eclipselink

    而“工具”标签可能意味着博主介绍了如何将 EclipseLink 集成到开发环境中,例如使用 Eclipse IDE 或 Maven 项目构建。 文件名 "jpa" 提示我们,压缩包可能包含与 JPA 相关的资源,比如示例代码、配置文件或者教程...

    eclipselink-2.7.8

    EclipseLink项目EclipseLink项目的目标是提供一个既全面又通用的完整持久性框架。 它可以在任何Java环境中运行,并且可以读写对象到几乎任何类型的数据源,包括关系数据库,XML,JSON或EIS系统。 EclipseLink将专注...

    eclipselink-2.5.2.v20140319-9ad6abd.zip

    - **对象/关系映射(ORM)**:EclipseLink允许将Java类映射到数据库表,属性映射到列,使得开发者可以处理对象而不是SQL。 - **动态模型**:支持动态实体,允许在运行时创建和修改实体类,适应多变的需求。 - **...

    Eclipse 插件 FsonFormat 一键解决复杂JSON ,快速实现JavaBean

    1、根据Gson库使用的要求,将JSON结构格式解析成实体类 2、一键解决复杂JSON ,快速实现JavaBean。 一句话就可以将复杂的JSON数据解析成相应的Bean对象。 JavaBean javaBean=gson.fromJson(jo.toString(),Json...

    EclipseLink通过JPA方式映射Sdo_geometry字段

    接下来,我们需要在Java实体类中进行适当的注解以指示EclipseLink如何处理SDO_GEOMETRY字段。在实体类中,对于SDO_GEOMETRY类型的字段,我们不再直接声明为数据库中的原始类型,而是使用Oracle的`JGeometry`类。`...

    Spring +JPA+EclipseLink Maven 配置

    EclipseLink是JPA的一种实现,它提供了高级特性和性能优化。Maven则是一个项目管理工具,能够管理项目的构建、报告和依赖关系。本篇文章将深入探讨如何配置Spring、JPA(EclipseLink实现)和Maven来创建一个高效且...

    EclipseLink 测试出错程序

    1. **配置问题**:EclipseLink的配置可能不正确,导致悲观锁机制没有被正确地应用到相关的实体类或特定的数据库操作中。检查persistence.xml文件,确保锁的类型设置为"pessimistic"。 2. **数据库支持**:悲观锁的...

    eclipse-json相关jar包

    - `commons-collections-3.2.2.jar`: Apache Commons Collections库提供了丰富的集合框架扩展,包括各种实用工具类和算法,用于增强Java集合框架的功能。 - `commons-lang-2.6.jar`: Apache Commons Lang是一个...

    ant-eclipselink-schemagen-1.0.6.jar.zip

    在EclipseLink中,Schemagen工具被用来从实体类生成数据库模式,这样开发者就可以快速地将Java模型转化为数据库表结构,简化了数据库的设计和维护工作。 4. **ant-eclipselink-schemagen-1.0.6.jar**: 这个JAR...

    eclipselink-src-4.0.2.v20230613.zip

    EclipseLink旨在提供一个完整的持久性框架,其运行环境几乎覆盖了所有Java环境,并能将对象读取、写入近乎任何类型的数据源,如关系数据库、XML、JSON或ELS系统。因其全面实现JPA规范(包括Java固有的查询语言JPQL、...

    JPA-eclipselink-project:使用 EclipseLink 实现的 JPA 项目示例

    JPA-eclipselink-项目使用 EclipseLink 实现的 JPA 项目示例JPA:java persistence api 是一个 O/R 映射持久化的规范。 API 描述了如何将 Java 对象映射到关系数据库。 此映射确保将对象转换为数据库,反之亦然,...

    eclipselink-plugins-nosql-4.0.2.v20230613-3bfa6ac6dd.zip

    EclipseLink,开源的持久化框架,是Eclipse Foundation的一部分,它EclipseLink,开源的持久化框架,是Eclipse Foundation的一部分,它实现了Java Persistence API (JPA) 和其他持久化标准。该框架的目标是为Java...

Global site tag (gtag.js) - Google Analytics