我想将来自 HTTP 请求的 XML 响应反序列化为 POJO 列表。我遇到的问题是 XML 对包含不同值的元素使用相同的名称“属性”。
<nowplaying-info-list>
<nowplaying-info mountName="FGDGFD" timestamp="1559761606" type="track">
<property name="cue_time_duration">
<![CDATA[262000]]>
</property>
<property name="cue_time_start">
<![CDATA[1559761571830]]>
</property>
<property name="cue_title">
<![CDATA[Marine marchande]]>
</property>
<property name="track_album_name">
<![CDATA[Octobre]]>
</property>
<property name="track_artist_name">
<![CDATA[Les Cowboys Fringants]]>
</property>
<property name="track_id">
<![CDATA[8133]]>
</property>
</property>
</nowplaying-info>
...
@JacksonXmlRootElement(localName = "nowplaying-info")
public class ScheduleItem implements Serializable {
@JacksonXmlProperty(localName = "property")
private String song = null;
private String artist = null;
private String cover = null;
private Long datetime = null;
我想将名称为 cue_title 的属性序列化为歌曲变量,将名称为 cue_time_start 的属性序列化为日期时间。
最佳答案
字段和列表之间没有简单的映射。我建议创建单独的模型,将 XML 有效负载反序列化到它,然后转换为所需的 POJO。下面的例子展示了这个想法:
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlText;
import java.io.File;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
public class XmlApp {
public static void main(String[] args) throws Exception {
System.out.println(new File(".").getAbsolutePath());
File xml = new File("./src/main/resources/test.xml");
XmlMapper xmlMapper = new XmlMapper();
xmlMapper.setDefaultUseWrapper(false);
xmlMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
TypeReference<List<NowPlayingInfo>> type = new TypeReference<List<NowPlayingInfo>>() {
};
List<NowPlayingInfo> infos = xmlMapper.readValue(xml, type);
List<ScheduleItem> items = infos.stream()
.map(NowPlayingInfo::getPropertiesAsMap)
.map(m -> {
ScheduleItem item = new ScheduleItem();
item.setSong(m.get("cue_title"));
item.setDatetime(Long.parseLong(m.get("cue_time_start")));
return item;
}).collect(Collectors.toList());
items.forEach(System.out::println);
}
}
class ScheduleItem {
private String song;
private String artist;
private String cover;
private Long datetime;
//getters, setters, toString
}
class NowPlayingInfo {
private String mountName;
private long timestamp;
private String type;
@JsonProperty("property")
private List<Property> properties;
public Map<String, String> getPropertiesAsMap() {
Map<String, String> map = new LinkedHashMap<>();
properties.forEach(p -> map.put(p.getName(), StringUtils.strip(p.getValue())));
return map;
}
//getters, setters, toString
}
class Property {
@JacksonXmlText
private String value;
@JacksonXmlProperty(isAttribute = true)
private String name;
//getters, setters, toString
}
上面的 XML 打印应用:
ScheduleItem{song='Marine marchande', artist='null', cover='null', datetime=1559761571830}
关于java - jackson 反序列化具有相同名称的xml字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56467014/
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最
我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只