绑定到JSON和XML –处理集合

EclipseLink JAXB(MOXy)的优势之一是能够通过一组元数据将对象模型映射到JSON和XML。 一个弱点是您需要在JSON键或XML元素上折衷集合属性。 我很高兴地说这个问题已经在EclipseLink 2.5(和EclipseLink 2.4.2)中得到解决,下面将通过一个示例进行演示。 您可以从2013年3月15日开始从晚上下载EclipseLink 2.5.0(或EclipseLink 2.4.2)每晚构建的版本,以进行尝试。

领域模型

默认情况下, JAXB(JSR-222)实现不会在集合数据周围输出分组元素。 这可以通过使用@XmlElementWrapper批注来完成(请参阅:J AXB和Collection属性
)。 该分组元素通常具有多个名称,并且比@XmlElement批注定义的重复元素更适合JSON数组的键。

package blog.json.collections;

import java.util.*;
import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlType(propOrder={'name', 'emailAddresses'})
public class Customer {

    private String name;
    private List<String> emailAddresses = new ArrayList<String>();

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @XmlElementWrapper(name='email-addresses')
    @XmlElement(name='email-address')
    public List<String> getEmailAddresses() {
        return emailAddresses;
    }

    public void setEmailAddresses(List&lt'String> emailAddresses) {
        this.emailAddresses = emailAddresses;
    }

}

演示版

我们将使用一个值指定JSON_WRAPPER_AS_ARRAY_NAME属性,以告诉MOXy它应该使用分组元素作为JSON数组值的名称。 然后,我们将使用相同的Marshaller将相同的对象输出到XML和JSON。

package blog.json.collections;

import java.util.*;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.MarshallerProperties;

public class Demo {

    public static void main(String[] args) throws Exception {
        Customer customer = new Customer();
        customer.setName('Jane Doe');
        customer.getEmailAddresses().add('jane.doe@example.com');
        customer.getEmailAddresses().add('jdoe@example.org');

        Map<String, Object> properties = new HashMap<String, Object>(1);
        properties.put(MarshallerProperties.JSON_WRAPPER_AS_ARRAY_NAME, true);
        JAXBContext jc = JAXBContext.newInstance(new Class[] {Customer.class}, properties);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        // Output XML
        marshaller.marshal(customer, System.out);

        // Output JSON
        marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, 'application/json');
        marshaller.marshal(customer, System.out);
    }

}

XML输出

以下是运行演示代码的XML输出。 我们看到电子邮件地址被编组为分组元素,其中包含集合中每个项目的电子邮件地址元素。

<?xml version='1.0' encoding='UTF-8'?>
<customer>
   <name>Jane Doe</name>
   <email-addresses>
      <email-address>jane.doe@example.com</email-address>
      <email-address>jdoe@example.org</email-address>
   </email-addresses>
</customer>

JSON输出

以下JSON输出是从相同的元数据生成的。 唯一的区别是我们告诉MOXy使用分组元素作为JSON数组值的名称。

{
   'customer' : {
      'name' : 'Jane Doe',
      'email-addresses' : [ 'jane.doe@example.com', 'jdoe@example.org' ]
   }
}

JAX-RS

您可以在JAX-RS环境中轻松地将MOXy用作JSON绑定提供程序(请参阅: MOXy作为您的JAX-RS JSON Provider – MOXyJsonProvider )。 您可以指定分组元素应作为与MOXyJsonProviderwrapperAsArrayName属性的JSON数组名。

package blog.json.collections;

import java.util.*;
import javax.ws.rs.core.Application;
import org.eclipse.persistence.jaxb.rs.MOXyJsonProvider;

public class CustomerApplication  extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        HashSet<Class<?>> set = new HashSet<Class<?>>(1);
        set.add(CustomerService.class);
        return set;
    }

    @Override
    public Set<Object> getSingletons() {
        MOXyJsonProvider moxyJsonProvider = new MOXyJsonProvider();
        moxyJsonProvider.setWrapperAsArrayName(true);

        HashSet<Object> set = new HashSet<Object>(1);
        set.add(moxyJsonProvider);
        return set;
    }

}

参考:Java XML&JSON绑定博客上, JCG合作伙伴 Blaise Doughan的JSON和XML绑定处理

翻译自: https://www.javacodegeeks.com/2013/03/binding-to-json-xml-handling-collections.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值