- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
各位,
我不熟悉使用 JAXB 编码和解码对象的世界。
我正在尝试编码一个对象,该对象最好被称为 map 列表的列表。
我试图达到的最终结果如下:
<parametricSearchResult>
<allFilters>
<name>custom_year</name>
<name>abcd</name>
</allFilters>
<allFields>
<field>
<name>custom_year</name>
<value count="10">2012</value>
<value count="8">2011</value>
</field>
<field>
<name>abcd</name>
<value count="8">2011</value>
</field>
</allFields>
</parametricSearchResult>
使用我编写的代码,我将其作为输出
<parametricSearchResult>
<allFilters>
<name>custom_year</name>
<name>abcd</name>
</allFilters>
<allFields>
<allFilters>
<mName>test</mName>
<field>
<value count="10">
<mValue>2012</mValue>
</value>
<value count="8">
<mValue>2011</mValue>
</value>
</field>
<name>test</name>
</allFilters>
<allFilters>
<mName>test</mName>
<field>
<value count="4">
<mValue>2011</mValue>
</value>
</field>
<name>test</name>
</allFilters>
</allFields>
</parametricSearchResult>
下面是我的代码
参数搜索结果
@XmlRootElement(name = "parametricSearchResult")
public class ParametricSearchResult {
private final List<String> mFilterFields = new ArrayList<String>();
private final List<Map<String, Integer>> mFiltersToCountsMap = new ArrayList<Map<String, Integer>>();
public void setFilterFields(List<String> fields) {
mFilterFields.addAll(fields);
}
@XmlElementWrapper(name = "allFilters")
@XmlElement(name = "name")
public List<String> getFilterFields() {
return mFilterFields;
}
@XmlElement(name = "allFields")
@XmlJavaTypeAdapter(JAXBParametricSearchResultSerializer.class)
public List<Map<String, Integer>> getValuesAndCounts() {
return mFiltersToCountsMap;
}
public void addFilterFieldsAndCounts(final String field, final String filterValue, final Integer count) {
final int index = mFilterFields.indexOf(field.toLowerCase());
if (index == -1) {
mFilterFields.add(field.toLowerCase());
HashMap<String, Integer> mapValuesToCounts = new HashMap<String, Integer>();
mapValuesToCounts.put(filterValue.toLowerCase(), Integer.valueOf(count));
mFiltersToCountsMap.add(mapValuesToCounts);
} else {
Map<String, Integer> mapValuesToCounts = mFiltersToCountsMap.get(index);
mapValuesToCounts.put(filterValue.toLowerCase(), Integer.valueOf(count));
}
}
public Map<String, Integer> getFilterValueToCountMap(String filterName) {
final int index = mFilterFields.indexOf(filterName.toLowerCase());
if (index == -1) {
return new HashMap<String, Integer>();
} else {
return mFiltersToCountsMap.get(index);
}
}
}
参数搜索结果类型
public class ParametricSearchResultType {
private final List<ParametricFilterType> allFilters = new ArrayList<ParametricFilterType>();
@XmlElement
public List<ParametricFilterType> getFilters() {
return allFilters;
}
public void setFilter(final ParametricFilterType data) {
allFilters.add(data);
}
}
参数过滤器类型
public class ParametricFilterType {
private String mName = "";
private final List<ParametricMapEntryType> mFilterAllEntries = new ArrayList<ParametricMapEntryType>();
@XmlElement(name = "name")
public String getName() {
return mName;
}
public void setName(final String data) {
mName = data;
}
public void setAllFilters(final ParametricMapEntryType data) {
mFilterAllEntries.add(data);
}
@XmlElementWrapper(name = "field")
@XmlElement(name = "value")
public final List<ParametricMapEntryType> getAllFilterEntries() {
return mFilterAllEntries;
}
}
ParametricMapEntryType
public class ParametricMapEntryType {
@XmlValue
public String mValue;
@XmlAttribute(name = "count")
public Integer mCount;
}
JAXBParametricSearchResultSerializer
public class JAXBParametricSearchResultSerializer extends XmlAdapter<ParametricSearchResultType, List<Map<String, Integer>>> {
@Override
public ParametricSearchResultType marshal(final List<Map<String, Integer>> data) throws Exception {
ParametricSearchResultType result = new ParametricSearchResultType();
for (Map<String, Integer> aMap : data) {
ParametricFilterType filters = new ParametricFilterType();
filters.mName = "test";
for (Map.Entry<String, Integer> anEntry : aMap.entrySet()) {
ParametricMapEntryType entry = new ParametricMapEntryType();
entry.mValue = anEntry.getKey();
entry.mCount = anEntry.getValue();
filters.mFilterAllEntries.add(entry);
}
result.allFilters.add(filters);
}
return result;
}
@Override
public List<Map<String, Integer>> unmarshal(final ParametricSearchResultType data) throws Exception {
return null;
}
}
参数搜索结果测试器
public class ParametricSearchResultTester {
ParametricSearchResult mResult;
@Before
public void setUp() throws Throwable {
mResult = new ParametricSearchResult();
mResult.addFilterFieldsAndCounts("CUSTOM_YEAR", "2012", 10);
mResult.addFilterFieldsAndCounts("CUSTOM_YEAR", "2011", 8);
mResult.addFilterFieldsAndCounts("ABCD", "2011", 4);
}
@After
public void tearDown() throws Throwable {
mResult = null;
}
@Test
public void testThatMarshallingWorks() throws Throwable {
JAXBContext context = JAXBContext.newInstance(ParametricSearchResult.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.marshal(mResult, System.out);
}
}
阅读更多文档后对代码进行了一些更改,并在进行这些更改后,我最终将其作为输出
<parametricSearchResult>
<allFilters>
<name>custom_year</name>
<name>abcd</name>
</allFilters>
<allFields>
<filters>
<field>
<value count="10">2012</value>
<value count="8">2011</value>
</field>
<name>test</name>
</filters>
<filters>
<field>
<value count="4">2011</value>
</field>
<name>test</name>
</filters>
</allFields>
</parametricSearchResult>
差不多了,但仍然需要对元素进行更多清理和重新排列。不确定在这里还能做什么。
最佳答案
对不起。如果没有深入了解您的需求、业务等,我无法给您非常期望的答案。
我的伪尝试来了。
@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement
@XmlType(propOrder = {"filterNames", "fields"})
public class ParametricSearchResult {
@XmlAccessorType(XmlAccessType.NONE)
@XmlType(propOrder = {"name", "values"})
public static class Field {
public static Field newInstance(final String name,
final Value... values) {
final Field instance = new Field();
instance.setName(name);
for (Value value : values) {
instance.getValues().add(value);
}
return instance;
}
@XmlAccessorType(XmlAccessType.NONE)
public static class Value {
public static Value newInstance(final int count,
final String value) {
final Value instance = new Value();
instance.setCount(count);
instance.setValue(value);
return instance;
}
public int getCount() {
return count;
}
public void setCount(final int count) {
this.count = count;
}
public String getValue() {
return value;
}
public void setValue(final String value) {
this.value = value;
}
@XmlAttribute(required = true)
private int count;
@XmlValue
private String value;
}
public String getName() {
return name;
}
public void setName(final String name) {
this.name = name;
}
public Collection<Value> getValues() {
if (values == null) {
values = new ArrayList<Value>();
}
return values;
}
@XmlElement(required = true)
private String name;
@XmlElement(name = "value")
private Collection<Value> values;
}
public static void main(final String[] args)
throws JAXBException, IOException {
final ParametricSearchResult result = new ParametricSearchResult();
result.getFilterNames().add("custom_year");
result.getFilterNames().add("abcd");
result.getFields().add(
Field.newInstance(
"custom_year",
Value.newInstance(10, "2012"),
Value.newInstance(8, "2011")));
result.getFields().add(
Field.newInstance(
"abcd",
Value.newInstance(8, "2011")));
final JAXBContext context =
JAXBContext.newInstance(ParametricSearchResult.class);
final Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.marshal(result, System.out);
System.out.println("-------------------------------------------------");
context.generateSchema(new SchemaOutputResolver() {
@Override
public Result createOutput(final String namespaceUri,
final String suggestedFileName)
throws IOException {
return new StreamResult(System.out) {
@Override
public String getSystemId() {
return "noid";
}
};
}
});
}
public Collection<String> getFilterNames() {
if (filterNames == null) {
filterNames = new ArrayList<String>();
}
return filterNames;
}
public Collection<Field> getFields() {
if (fields == null) {
fields = new ArrayList<Field>();
}
return fields;
}
@XmlElement(name = "name")
@XmlElementWrapper(name = "allFilters", nillable = true, required = true)
private Collection<String> filterNames;
@XmlElement(name = "field")
@XmlElementWrapper(name = "allFields", nillable = true, required = true)
private Collection<Field> fields;
}
打印
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<parametricSearchResult>
<allFilters>
<name>custom_year</name>
<name>abcd</name>
</allFilters>
<allFields>
<field>
<name>custom_year</name>
<value count="10">2012</value>
<value count="8">2011</value>
</field>
<field>
<name>abcd</name>
<value count="8">2011</value>
</field>
</allFields>
</parametricSearchResult>
这是 XML 模式。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="parametricSearchResult" type="parametricSearchResult"/>
<xs:complexType name="parametricSearchResult">
<xs:sequence>
<xs:element name="allFilters" nillable="true">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="allFields" nillable="true">
<xs:complexType>
<xs:sequence>
<xs:element name="field" type="field" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="field">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="value" type="value" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="value">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="count" type="xs:int" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:schema>
关于java - JAXB 编码映射列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11744813/
如标题所示,ans_list是一个答案列表,ans_index是一个数字(答案在词汇表中的索引,但与atm无关) 这里生成的 tree.anslist 是什么? (例如,仅针对第一个),忽略迭代。 f
我目前将用户的输入存储在逗号分隔的列表中,如下所示: Userid | Options 1 | 1,2,5 用户在一个数组形式中勾选一组选项,然后用逗号连接起来 1,2,5 然后 MySQ
我目前将用户的输入存储在逗号分隔的列表中,如下所示: Userid | Options 1 | 1,2,5 用户在一个数组形式中勾选一组选项,然后用逗号连接起来 1,2,5 然后 MySQ
我想知道如何完全展平列表和包含它们的东西。除其他外,我想出了一个解决方案,它可以将具有多个元素的东西滑倒并将它们放回原处,或者在滑倒后将具有一个元素的东西拿走。 这与 How do I “flatte
我想知道如何完全展平列表和包含它们的东西。除其他外,我想出了一个解决方案,它可以将具有多个元素的东西滑倒并将它们放回原处,或者在滑倒后将带有一个元素的东西拿走。 这与 How do I “flatte
这个问题已经有答案了: Convert nested list to 2d array (3 个回答) 已关闭 7 年前。 java中有没有快捷方式可以转换 List> 到 String[][] ?
我在排序时遇到问题 List> 。我创建了一个自定义比较器,在其中编写了对数据进行排序的代码。 public class CustomComparator implements Comparator
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Java Generics: Cannot cast List to List? 我只是想知道为什么下面的java代
试图想出一个 LINQy 方法来做到这一点,但我什么也没想到。 我有一个对象列表<>,其中包含一个属性,该属性是逗号分隔的字母代码列表: lst[0].codes = "AA,BB,DD" lst[1
假设我有这些任务: points = [] point = (1, 2) 我怎么会这样做: points += point 它工作得很好,并且给了我点 = [1, 2]。但是,如果我这样做: poin
如何在 scala 中将 List[Task[List[Header]]] 类型转换为 Task[List[Header]]。 我有一个方法返回 Task[List[Header]] 并多次调用 do
如何在 Java 中查找二维列表的元素? 我有一个参数为 List> 的函数我想知道如何找到这个列表的行和列。 最佳答案 如果你喜欢 List> obj 然后你就可以像这样访问 obj.get(cur
分配 List到 List工作正常。 分配 List>到 List>不编译。 代码 public class Main { public static void main(String[] a
我正在用 Java 编写一个方法,该方法必须接收并迭代 Serializable 的 List。 有什么区别: public void myMethod(List list) { } 和 public
我看到很多人想用 mvvm 更新网格/列表/树的一部分,但他们不想刷新整个列表。 对于所有遇到此问题的人,我做了以下示例。 希望这对你有用。 最佳答案 这是一个简单的例子。整个代码中最重要的是: Bi
我正在为现有的 C++ 库编写包装器,该库使用列表,其中 T 是自定义结构。我被建议使用 vector 而不是列表,但我试图避免修改库。 为了更好地理解这个场景,我做了一个简单的应用程序,使用一个列表
List list List list 这两种声明有什么区别吗? 谢谢, 最佳答案 是的。 List可以包含所有派生自 Base 的不同事物的混合物. List包含同质项(从某种意义上说,它们必须全部
有人可以尽可能详细地解释以下类型之间的区别吗? List List List 让我更具体一点。我什么时候想使用 // 1 public void CanYouGiveMeAnAnswer(List l
我有一个元组列表,每个元组都是一对列表。所以我的数据看起来像: mylist = [(['foo', 'bar'], ['bar', 'bar']),(['bar', 'bar'],['bar', '
也许是一个时髦的标题,但我遇到了以下问题: 给定一个类型为 (a * b) list 的列表,我想创建一个类型为 (a * b list) list 的新列表。一个例子: 给定列表 let testL
我是一名优秀的程序员,十分优秀!