亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將 JSON 解析為結果對象時無法反序列化對象的實例

將 JSON 解析為結果對象時無法反序列化對象的實例

縹緲止盈 2023-08-23 15:09:20
我想將具有配置屬性的 XML 文件解析為 JSON,然后將此 JSON 轉換為最終結果對象。我的班級看起來像:@SpringBootApplicationpublic class AdvancedApplication {  public static void main(String[] args) {    SpringApplication.run(AdvancedApplication.class, args);    XmlMapper xmlMapper = new XmlMapper();    try {      List XMLEntries = xmlMapper          .readValue(new ClassPathResource("configuration.xml")              .getFile(), List.class);      ObjectMapper mapper = new ObjectMapper();      String jsonConfig = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(XMLEntries);      JsonNode parent = new ObjectMapper().readTree(jsonConfig);      String content = parent.path("serverport").asText();      System.out.println(content);      System.out.println(jsonConfig);    } catch (IOException e) {      e.printStackTrace();    }  }}在第一種情況下:List XMLEntries = xmlMapper          .readValue(new ClassPathResource("configuration.xml")              .getFile(), List.class);上面的方法將 JSON 包裝在列表中,結果如下:[ {  "serverport" : "9966"}, {  "clientport" : "9999",  "serverHost" : "localhost"} ]但在這種情況下,我無法使用以下行讀取值:String content = parent.path("serverport").asText();因為內容是空的。最后,我決定以這種特殊方式將 JSON 轉換為結果對象 Config:Config configObject = mapper.readValue(jsonConfig, Config.class);但不幸的是,我收到了一個異常,例如:com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `com.javase.advanced.config.Config` out of START_ARRAY token at [Source: (String)"[ {  "serverport" : "9966"}, {  "clientport" : "9999",  "serverHost" : "localhost"} ]"; line: 1, column: 1]我的configuration.xml 文件如下所示:<?xml version="1.0" encoding="UTF-8"?><config>  <server serverport="9966"/>  <client clientport="9999">    <serverHost>localhost</serverHost>  </client></config>以及配置類如下:@NoArgsConstructor@Getter@AllArgsConstructor@ToStringpublic class Config {  private Server server;  private Client client;}我想要實現的是將configuration.xml 文件解析為JSON 并將其轉換為Config 對象以創建配置類以供進一步使用。
查看完整描述

2 回答

?
慕雪6442864

TA貢獻1812條經驗 獲得超5個贊

這應該有效。您可以使用 JAXB 進行解組。請閱讀有關 JAXB 的信息。還要注意如何使用XmlElement和。XmlAttribute


String xmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +

                "<config>\n" +

                "  <server serverport=\"9966\"/>\n" +

                "  <client clientport=\"9999\">\n" +

                "    <serverHost>localhost</serverHost>\n" +

                "  </client>\n" +

                "</config>";


JAXBContext jaxbContext;

 try

   {

      jaxbContext = JAXBContext.newInstance(Config.class);

      Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();

      Config config = (Config) jaxbUnmarshaller.unmarshal(new StringReader(xmlString));

      System.out.println(config);

   }catch (JAXBException e){

      e.printStackTrace();

  }

配置類將是這樣的


@XmlRootElement(name = "config")

@XmlAccessorType(XmlAccessType.PROPERTY)

public class Config {

    public Server server;

    public Client client;


    public Config() {

    }


    public Server getServer() {

        return server;

    }


    public void setServer(Server server) {

        this.server = server;

    }


    public Client getClient() {

        return client;

    }


    public void setClient(Client client) {

        this.client = client;

    }

}

服務器類


public class Server {

    @XmlAttribute(name = "serverport")

    public String serverPort;

}

客戶類


public class Client {


    @XmlAttribute(name = "clientport")

    public String clientPort;


    @XmlElement

    public String serverHost;

}


查看完整回答
反對 回復 2023-08-23
?
飲歌長嘯

TA貢獻1951條經驗 獲得超3個贊

該解決方案pvpkiran解決了一個問題,但我無法忍受 Jackson 無法將 XML 解析為單個對象的事實。調查帶來了理想的效果,最終發現 我的 pom.XML 中有兩個類似的依賴項,如jackson-databind和。jackson-xml-databind原來他們之間有矛盾。注釋掉后jackson-xml-databind一切正常。


現在我的課程看起來像:


客戶端類


@Getter

@NoArgsConstructor

@Setter

public class Client {


  @JacksonXmlProperty(localName = "clientport")

  private String clientPort;

  @JacksonXmlProperty(localName = "serverHost")

  private String serverHost;


}

服務器類


@AllArgsConstructor

@Getter

@NoArgsConstructor

@Setter

public class Server {

  @JacksonXmlProperty(localName = "serverport")

  private String serverPort;

}

配置類


@AllArgsConstructor

@NoArgsConstructor

@Getter

@Setter

@ToString

@JacksonXmlRootElement(localName = "config")

public class Config {


  private Server server;

  private Client client;

}

再次感謝您的承諾。


查看完整回答
反對 回復 2023-08-23
  • 2 回答
  • 0 關注
  • 209 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號