有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在解组Json对象时,java“prolog中不允许内容”

我正在尝试解组从Restful服务响应返回的Json对象。但它在进行解组时抛出异常

MyClass。java

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class MyClass
{
  @XmlElement(name="id")
  private String id;

  @XmlElement(name="f-name")
  private String fname;


  @XmlElement(name="l-name")
  private String lname;

 // getters and setters for these

}

解组方法

JAXBContext context = JAXBContext.newInstance(MyClass.class);
Unmarshaller unMarshaller = context.createUnmarshaller();  
URL url = new URL("http://localhost:8080/service-location");
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setRequestMethod("GET");
connection.setRequestProperty("Accept",  "application/json");
connection.connect();
MyClass myclass=(MyClass)unMarshaller.unmarshal(connection.getInputStream());

当我尝试使用一些浏览器客户端时,我得到了如下正确的响应

[
    {
        "fname": "JOHN",
        "lname": "Doe",
        "id": "abc123"          
    }
]

但是我试图在我的客户机代码中进行解组,它抛出了SAXParserException

Caused by: org.xml.sax.SAXParseException;  lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.

我不确定我做错了什么。这是一种解组JSON对象的方法,还是有其他方法

更新:解决方案

我通过实现Jackson's ObjectMapper而不是JAXB的常规UnMarshaller解决了这个问题。这是我的密码

ObjectMapper mapper = new ObjectMapper();
JavaType type = mapper.getTypeFactory().constructCollectionType(List.class, MYClass.class);
mapper.configure(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
list = mapper.readValue(jsonString, type); // JsonString is my response converted into String of json data.

共 (2) 个答案

  1. # 1 楼答案

    您需要将解组器配置为JSON,否则它将默认为XML解析

    Unmarshaller unmarshaller = context.createUnmarshaller();
    unmarshaller.setProperty(UnmarshallerProperties.MEDIA_TYPE, "application/json");
    unmarshaller.setProperty(UnmarshallerProperties.JSON_INCLUDE_ROOT, false);
    

    或者使用JSON解析器(如Google GSON)进行解组