我有一个示例类:
class Zoo {
    public Collection<? extends Animal> animals;
}

当与MOXy序列化时,我得到:

{
    "bird": [
        {
            "name": "bird-1","wingSpan": "6 feets","preferredFood": "food-1"
        }
    ],"cat": [
        {
            "name": "cat-1","favoritetoy": "toy-1"
        }
    ],"dog": [
        {
            "name": "dog-1","breed": "bread-1","leashColor": "black"
        }
    ]
}

为什么使用数组指示符“[]”,而鸟,猫和狗不是数组?
第二,有没有办法摆脱“鸟”,“猫”和“狗”?

换句话说,我试图去:

{
        {
            "name": "bird-1","preferredFood": "food-1"
        },{
            "name": "cat-1","favoritetoy": "toy-1"
        },{
            "name": "dog-1","leashColor": "black"
        }
}

谢谢,
Behzad

解决方法

问题#1

Why is it using array indicators “[]”,while bird,cat,and dog are
not arrays?

要获取此JSON表示,您已将模型映射到@XmlElementRef注释,该注释告诉JAXB使用@XmlRootElement注释的值作为继承指标.使用MOXy的JSON绑定这些成为关键.我们使这些键JSON值的值由于键不允许重复.

动物园

在你的模型中,你的动物字段/属性上有@XmlElementRef注释.

import java.util.Collection;
import javax.xml.bind.annotation.XmlElementRef;

class Zoo {
    @XmlElementRef
    public Collection<? extends Animal> animals;
}

动物

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccesstype.FIELD)
@XmlSeeAlso({Bird.class,Cat.class,Dog.class})
public abstract class Animal {

    private String name;

}

在每个子类上,都有一个@XmlRootElement注释.

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Bird extends Animal {

    private String wingSpan;
    private String preferredFood;

}

input.json /输出

{
   "bird" : [ {
      "name" : "bird-1","wingSpan" : "6 feets","preferredFood" : "food-1"
   } ],"cat" : [ {
      "name" : "cat-1","favoritetoy" : "toy-1"
   } ],"dog" : [ {
      "name" : "dog-1","breed" : "bread-1","leashColor" : "black"
   } ]
}

了解更多信息

> http://blog.bdoughan.com/2010/11/jaxb-and-inheritance-using-substitution.html

问题#2

Second,is there a way to get rid of “bird”,“cat”,and “dog”?

您将需要某种继承指标来表示各种子类.

选项#1 – @ XmlDescriminatorNode / @ XmlDescriminatorValue

这里我使用MOXy的@ XmlDescriminatorNode / @ XmlDescriminatorValue注释.

动物园

import java.util.Collection;

class Zoo {
    public Collection<? extends Animal> animals;
}

动物

import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmldiscriminatorNode;

@XmlAccessorType(XmlAccesstype.FIELD)
@XmlSeeAlso({Bird.class,Dog.class})
@XmldiscriminatorNode("@type")
public abstract class Animal {

    private String name;

}

import org.eclipse.persistence.oxm.annotations.XmldiscriminatorValue;

@XmldiscriminatorValue("bird")
public class Bird extends Animal {

    private String wingSpan;
    private String preferredFood;

}

input.json /输出

{
   "animals" : [ {
      "type" : "bird","name" : "bird-1","preferredFood" : "food-1"
   },{
      "type" : "cat","name" : "cat-1","favoritetoy" : "toy-1"
   },{
      "type" : "dog","name" : "dog-1","leashColor" : "black"
   } ]
}

了解更多信息

> http://blog.bdoughan.com/2010/11/jaxb-and-inheritance-moxy-extension.html

选项#2 – @XmlClassExtractor

ClassExtractor(AnimalExtractor)

您可以编写一些基于JSON内容确定适当子类的代码.

import org.eclipse.persistence.descriptors.ClassExtractor;
import org.eclipse.persistence.sessions.*;

public class AnimalExtractor extends ClassExtractor {

    @Override
    public Class extractClassFromrow(Record record,Session session) {
        if(null != record.get("@wingSpan") || null != record.get("@preferredFood")) {
            return Bird.class;
        } else if(null != record.get("@favoritetoy")) {
            return Cat.class;
        } else {
            return Dog.class;
        }
    }

}

动物

@XmlClassExtractor注释用于指定ClassExtractor.

import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlClassExtractor;

@XmlAccessorType(XmlAccesstype.FIELD)
@XmlSeeAlso({Bird.class,Dog.class})
@XmlClassExtractor(AnimalExtractor.class)
public abstract class Animal {

    private String name;

}

由于MOXy如何处理@XmlElement和@XmlAttribute注释,您希望将ClassExtractor可用的任何数据都需要使用@XmlAttribute进行注释.

import javax.xml.bind.annotation.XmlAttribute;

public class Bird extends Animal {

    @XmlAttribute
    private String wingSpan;

    @XmlAttribute
    private String preferredFood;

}

input.json /输出

{
   "animals" : [ {
      "wingSpan" : "6 feets","preferredFood" : "food-1","name" : "bird-1"
   },{
      "favoritetoy" : "toy-1","name" : "cat-1"
   },{
      "breed" : "bread-1","leashColor" : "black","name" : "dog-1"
   } ]
}

了解更多信息

> http://blog.bdoughan.com/2012/02/jaxb-and-inheritance-eclipselink-moxy.html

演示代码

以下演示代码可用于上述两种映射.

import java.util.*;
import javax.xml.bind.*;
import javax.xml.transform.stream.StreamSource;
import org.eclipse.persistence.jaxb.JAXBContextProperties;

public class Demo {

    public static void main(String[] args) throws Exception {
        Map<String,Object> properties = new HashMap<String,Object>();
        properties.put(JAXBContextProperties.MEDIA_TYPE,"application/json");
        properties.put(JAXBContextProperties.JSON_INCLUDE_ROOT,false);
        JAXBContext jc = JAXBContext.newInstance(new Class[] {Zoo.class},properties);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        StreamSource json = new StreamSource("src/forum14210676/input.json");
        Zoo zoo = unmarshaller.unmarshal(json,Zoo.class).getValue();

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true);
        marshaller.marshal(zoo,System.out);
    }

}

java – EclipseLink MOXy JSON序列化的更多相关文章

  1. nsmutablearray – Sprite Kit iOS7 – SKNode UserData属性不存储值

    谢谢解决方法userData属性最初为零.您必须先创建一个字典并进行分配:

  2. ios – CGPath和UIBezierPath()有什么区别?

    目前,我正在努力制作一个自定义按钮,我有一个图像,并具有坐标,但我发现您可以通过使用CGPath类或UIBezierPath创建一个按钮/对象类.有人可以告诉我两者有什么区别?解决方法CGPath是CoreGraphics库的不透明类型,而UIBezierPath是UIKit中的Obj-C类.UIBezierPath是一个围绕CGPath的包装,具有更加面向对象的界面和一些方便的方法.使用CGPath可能会略微更快,因为它不必经过Obj-C,并且它具有更高级的功能,如CGPathApply.重要的是,UI

  3. swift 快速奔跑的兔几 本节的内容是:序列化与反序列化

    在cocoa中,我们经常需要向磁盘保存数据块,cocoa将这些数据块表示为NSData对象例如,有一个字符串,将其转换为NSData,可以使用如下方法:我们还可以将对象转化为数据。遵守协议NSCoding的对象可以转换为NSData对象,也可以从NSData对象中加载,方法如下:

  4. Friday Q&amp;A 2015-11-20:协变与逆变

    作者:MikeAsh,原文链接,原文日期:2015-11-20译者:Cee;校对:千叶知风;定稿:numbbbbb在现代的编程语言中,子类型和超类型已经成为了非常常见的一部分了。但并不意味着所有的Animal都是Cat。CrazyCatLady.purchaseAnimal会返回一只Cat。类似,CrazyCatLady返回的Cat也是有效的。CrazyCatLady的pet方法期望参数是一只Cat。这破坏了Liskov替换原则:此时的CrazyCatLady并不能在任意的地方替代Person的使用。与此

  5. Swift中一个类中的枚举enum类型的数据该如何实现序列化NSCoder

    简述昨天在开发中遇到了这样一个问题,需要用NSUserDefaults持久化一些数据,其中需要保存一个自己定义的类对象。结束其实枚举本来就是一个Int,因此我们将其声明为Int型就可以根据Int值初始化了,以此实现序列化和反序列化。

  6. swift json的序列化和反序列化

    还有一点东西没写完,权作笔记参考:http://www.hangge.com/blog/cache/detail_983.html

  7. Swift中对象序列化的实现

    Swift中对象序列化的实现在swift中要使某个类可以序列化,只需要类实现NSCoding协议,并实现协议中的一个必要的构造函数和一个方法,分别对应序列化和反序列化的二个过程。

  8. Alamofire 4.0 迁移指南

    原文:Alamofire4.0MigrationGuide作者:cnoon译者:kemchenj译者注:最近打算把公司项目迁移到Swift3.0,顺手把Alamofire4.0的迁移指南翻译了,之前虽然读过一部分源码,但还是看到了很多新东西,新的Adapter和Retrier我都打算用到项目里,希望大家看完也能够有收获.Alamofire4.0是Alamofire最新的一个大版本更新,一个基于Sw

  9. [HandyJSON] 在Swift语言中处理JSON - 转换JSON和Model

    而HandyJSON是其中使用最舒服的一个库,本文将介绍用HandyJSON来进行Model和JSON间的互相转换。而HandyJSON另辟蹊径,采用Swift反射+内存赋值的方式来构造Model实例,规避了上述两个方案遇到的问题。所以我们要定义一个Mapping函数来做这两个支持:就这样,HandyJSON完美地帮我们进行了JSON到Model类的转换。把Model转换为JSON文本HandyJSON还提供了把Model类序列化为JSON文本的能力,简直无情。

  10. as、as!、as?

    1,as使用场合从派生类转换为基类,向上转型消除二义性,数值类型转换switch语句中进行模式匹配如果不知道一个对象是什么类型,你可以通过switch语法检测它的类型,并且尝试在不同的情况下使用对应的类型进行相应的处理。使用场合向下转型时使用。由于是强制类型转换,如果转换失败会报runtime运行错误。成功的话返回可选类型值,需要我们拆包使用。在转换失败的时候也不会出现错误,所以对于如果能确保100%会成功的转换则可使用as!

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部