我試圖使用 Jackson 庫編組和解組 XML 檔案。
源檔案是下面的“team.xml”檔案。'團隊.xml'
<team>
<member>
<name>Mike</name>
<tel_no>123-1234-1234</tel_no>
</member>
<member>
<name>John</name>
<tel_no>123-4567-8901</tel_no>
</member>
</team>
'<member>' 元素是兩個,但沒有像 '<members>' 那樣被包裝成一個容器元素。
無論如何,我成功地使用@JsonSetter 將“team.xml”反序列化(解組)到“Team.class”到“Team.class”的“public void addMember(Member)”。
String xmlStr = //
"<team>\n" //
" <member>\n" //
" <name>Mike</name>\n" //
" <tel_no>123-1234-1234</tel_no>\n" //
" </member>\n" //
" <member>\n" //
" <name>John</name>\n" //
" <tel_no>123-4567-8901</tel_no>\n" //
" </member>\n" //
"</team>";
XmlMapper mapper = new XmlMapper();
Team team = mapper.readValue(xmlStr, Team.class);
System.out.println("------------ unmarshall -----------");
System.out.println(team);
然后我將 Team.class 的一個物件寫入 XML 字串。結果如下....:(
System.out.println("------------ marshall -----------");
System.out.println(mapper.writeValueAsString(team));
XML string ...
<team>
<member>
<member>
<name>Mike</name>
<tel_no>123-1234-1234</tel_no>
</member>
<member>
<name>John</name>
<tel_no>123-4567-8901</tel_no>
</member>
</member>
<name/>
</team>
兩個'<member> 元素被包裹到'<member>',父元素中。
如何將 Team.class 的物件序列化(編組)為 XML 字串等于“輸入 XML 字串”?
也就是說,如何將陣列值序列化(編組)到每個值?
請告訴我如何解決這個問題...
謝謝。
---------- JAVA 類 -----------
成員類
package stackoverflow.question.xml;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonRootName;
/**
*
* @since 2021. 12. 21.
* @version
* @author Park_Jun_Hong_(parkjunhong77@gmail.com)
*/
@JsonRootName("member")
public class Member {
@JsonProperty("name")
private String name;
@JsonProperty("tel_no")
private String telNo;
public Member() {
}
public String getName() {
return name;
}
public String getTelNo() {
return telNo;
}
public void setName(String name) {
this.name = name;
}
public void setTelNo(String telNo) {
this.telNo = telNo;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("Member [name=");
builder.append(name);
builder.append(", telNo=");
builder.append(telNo);
builder.append("]");
return builder.toString();
}
}
班級
package stackoverflow.question.xml;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonRootName;
import com.fasterxml.jackson.annotation.JsonSetter;
/**
*
* @since 2021. 12. 21.
* @version
* @author Park_Jun_Hong_(parkjunhong77@gmail.com)
*/
@JsonRootName("team")
public class Team {
@JsonProperty("name")
private String name;
private List<Member> member;
public Team() {
}
@JsonSetter("member")
public void addMember(Member m) {
if (m == null) {
return;
}
if (this.member == null) {
this.member = new ArrayList<>();
}
this.member.add(m);
}
public List<Member> getMember() {
return member;
}
public String getName() {
return name;
}
public void setMember(List<Member> member) {
this.member = member;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("Team [name=");
builder.append(name);
builder.append(", member=");
builder.append(member);
builder.append("]");
return builder.toString();
}
}
uj5u.com熱心網友回復:
不幸的是,您正試圖以錯誤的方式反序列化和序列化 xml。Jackson 庫包含針對 xml 之類JacksonXmlProperty的特定JacksonXmlElementWrapper注釋,對于 xml 串列,有特定注釋,因此您必須像下面這樣重寫您的類:
@Data
public class Team {
@JacksonXmlProperty(localName = "member")
@JacksonXmlElementWrapper(useWrapping = false)
private List<Member> member;
}
@Data
public class Member {
@JacksonXmlProperty(localName = "name")
private String name;
@JacksonXmlProperty(localName = "tel_no")
private String telNo;
}
有關更多資訊,您可以參考我包含的鏈接,下面是您包含的 xml 的反序列化和序列化示例:
Team team = mapper.readValue(xml, Team.class);
mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
String s = mapper.writeValueAsString(team);
System.out.println(s); //<-- it prints an xml as a string equal to the original one
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/389422.html
