为了账号安全,请及时绑定邮箱和手机立即绑定

将 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 关注
  • 98 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信