无法使用简单的反序列化元素列表

时间:2014-09-04 08:10:07

标签: java simple-framework

我从REST API获得了以下XML

<?xml version="1.0" encoding="UTF-8"?>
<list>
    <securitygroup>
        <objectId>securitygroup-1</objectId>
        <name>Activity Monitoring Data Collection</name>      
    </securitygroup>
    <securitygroup>
        <objectId>securitygroup-10</objectId>
        <name>object2</name>      
    </securitygroup>
</list>

我的课程定义如下

@Root(strict = false)
public class SecurityGroup
{
    @Element
    String objectId;

    @Element
    String name;
}


@Root
public class SecurityGroupList
{
    @ElementList(inline = true)
    public List<SecurityGroup> list;
}

当我尝试淡化它时

String input = "The above XML..."
final Persister persister = new Persister();
SecurityGroupList list =  persister.read(SecurityGroupList.class, input);

我收到以下消息的异常&#34;元素&#39; SecurityGroup&#39;在第1行&#34;类cms_proxy.CMS.nsx.objects.SecurityGroupList中没有匹配项; (忽略行号,它在字符串I&#39; m using中的一行中)。我试图将@ElementList中的名称和条目设置为&#34; securitygroup&#34;但仍然得到同样的信息。

这听起来非常微不足道,我确信我错过了一些非常简单的事情,但我无法让它发挥作用。

感谢。

更新

由于决定从简单到Jaxb的决定,我没有时间检查答案,对不起。再次感谢。

3 个答案:

答案 0 :(得分:0)

似乎在公然地告诉你,出了什么问题?我可能会弄错。仍然,XML的第二个条目具有“objectTypeName”而不是“name”作为条目;该列表是隐式严格的,因此如果Persister正在寻找一个“SecurityGroup”类,其中有一个字段,其中反序列化应该填充并随后搜索字段“objectTypeName”,它将找不到所述字段并失败,因为它是类由于您的示例没有规定此类字段,因此未找到尝试填充的内容。

来源:

  1. http://simple.sourceforge.net/download/stream/doc/javadoc/org/simpleframework/xml/core/Persister.html

答案 1 :(得分:0)

  

这听起来非常微不足道,我确信我错过了一些非常简单的事情,但我无法让它发挥作用。

是的,这是你的错误:

@Root(strict = false)
public class SecurityGroup
{
    // ...
}

这将使用SecurityGroup - 类的名称 - 作为元素名称。因此,该元素被命名为<SecurityGroup>...</SecurityGroup>。但是您的XML将其包含为小写:<securitygroup>...</securitygroup>。两者都不匹配,并且简单地抛出异常来表示。

解决方案:您可以使用annotation-argument设置自定义名称:

@Root(name = "securitygroup",strict = false)
public class SecurityGroup
{
    // ...
}

现在使用正确的名称,代码应该有效。

答案 2 :(得分:0)

XML区分大小写

@Root
public class SecurityGroupList
{
    @ElementList(inline = true, entry="securitygroup")
    public List<SecurityGroup> list;
}