Ошибка: «Текст JSONArray должен начинаться с '[' в 1 [символ 2, строка 1]» не должен применяться - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть класс ShipmentRequest, который был инициализирован через JAXB.

В моем основном классе для отправки POST-запроса REST-API я заполняю объект этого класса необходимым вводом и помещаю его в JSONArray

public JSONArray array = new JSONArray();
array.add(shipmentRequest);

И, наконец, я начинаю POST:

HttpResponse<JsonNode> response = Unirest.post("https://someURL/services/rest/url")
.queryString("access_token","someTokenCode")
.body(array.get(0)).asJson();

Я не понимаю ошибку, потому что когда я использую myJSONArray.toJSONString (), я получаю следующий вывод:

[{"Id":"123456","Reference":"Send","transport":{"transporterCode":"Deliverer","trackAndTrace":"someCode123456"}}]

Что мне не хватает? Мой первый персонаж это '['?

РЕДАКТИРОВАТЬ 1, код запроса на отгрузку

<code>//
// Diese Datei wurde mit der JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 generiert 
// Siehe <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
// Änderungen an dieser Datei gehen bei einer Neukompilierung des Quellschemas verloren. 
// Generiert: 2017.10.18 um 11:02:47 AM CEST 
//


package bol.shipment;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;


/**
 * <p>Java-Klasse für anonymous complex type.
 * 
 * <p>Das folgende Schemafragment gibt den erwarteten Content an, der in dieser Klasse enthalten ist.
 * 
 * <pre>
 * &lt;complexType>
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       &lt;sequence>
 *         &lt;element name="OrderItemId" type="{http://www.w3.org/2001/XMLSchema}long"/>
 *         &lt;element name="ShipmentReference" type="{http://www.w3.org/2001/XMLSchema}string"/>
 *         &lt;element name="Transport" minOccurs="0">
 *           &lt;complexType>
 *             &lt;complexContent>
 *               &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *                 &lt;sequence>
 *                   &lt;element name="TransporterCode" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
 *                   &lt;element name="TrackAndTrace" type="{https://plazaapi.bol.com/services/xsd/v2/plazaapi.xsd}TrackAndTrace" minOccurs="0"/>
 *                 &lt;/sequence>
 *               &lt;/restriction>
 *             &lt;/complexContent>
 *           &lt;/complexType>
 *         &lt;/element>
 *         &lt;element name="ShippingLabelCode" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
 *       &lt;/sequence>
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * 
* * * / @XmlAccessorType (XmlAccessType.FIELD) @XmlType (name = "", propOrder = { "OrderItemId", "ShipmentReference", "транспорт", }) @XmlRootElement (name = "ShipmentRequest") открытый класс ShipmentRequest { @XmlElement (name = "OrderItemId") защищенный String orderItemId; @XmlElement (name = "ShipmentReference", обязательно = true) защищенная строка @XmlElement (name = "Transport") охраняемая пересылка по запросу. Транспортный транспорт; / ** * Ruft den Wert der orderItemId-Eigenschaft ab. * * / public String getOrderItemId () { return orderItemId; } / ** * Legt den Wert der orderItemId-Eigenschaft fest. * * / public void setOrderItemId (String value) { this.orderItemId = value; } / ** * Ruft den Wert der shipmentReference-Eigenschaft ab. * * @вернуть * возможный объект * {@link String} * * / public String getShipmentReference () { возврат товара } / ** * Legt den Wert der shipmentReference-Eigenschaft fest. * * @param value * разрешенный объект * {@link String} * * / public void setShipmentReference (String value) { this.shipmentReference = значение; } / ** * Ruft den Wert der transport-Eigenschaft ab. * * @вернуть * возможный объект * {@link ShipmentRequest.Transport} * * / public ShipmentRequest.Transport getTransport () { обратный транспорт; } / ** * Legt den Wert der transport-Eigenschaft fest. * * @param value * разрешенный объект * {@link ShipmentRequest.Transport} * * / public void setTransport (значение ShipmentRequest.Transport) { this.transport = value; } / ** *

Java-Klasse для анонимного сложного типа. * *

Das folgende Schemafragment gibt den erwarteten Содержит информацию о дизеле в классе Klasse enthalten ist. * *

     * &lt;complexType>
     *   &lt;complexContent>
     *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
     *       &lt;sequence>
     *         &lt;element name="TransporterCode" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
     *         &lt;element name="TrackAndTrace" type="{https://plazaapi.bol.com/services/xsd/v2/plazaapi.xsd}TrackAndTrace" minOccurs="0"/>
     *       &lt;/sequence>
     *     &lt;/restriction>
     *   &lt;/complexContent>
     * &lt;/complexType>
     * 
* * * / @XmlAccessorType (XmlAccessType.FIELD) @XmlType (name = "", propOrder = { "TransporterCode", "TrackAndTrace" }) открытый статический класс Transport { @XmlElement (name = "TransporterCode") защищенный String transporterCode; @XmlElement (name = "TrackAndTrace") защищенный String trackAndTrace; / ** * Ruft den Wert der transporterCode-Eigenschaft ab. * * @вернуть * возможный объект * {@link String} * * / public String getTransporterCode () { возвратный транспортный код; } / ** * Legt den Wert der transporterCode-Eigenschaft Fest. * * @param value * разрешенный объект * {@link String} * * / public void setTransporterCode (String value) { this.transporterCode = value; } / ** * Ruft den Wert der trackAndTrace-Eigenschaft ab. * * @вернуть * возможный объект * {@link String} * * / public String getTrackAndTrace () { return trackAndTrace; } / ** * Legt den Wert der trackAndTrace-Eigenschaft Fest. * * @param value* разрешенный объект * {@link String} * * / public void setTrackAndTrace (String value) { this.trackAndTrace = value; } } }

РЕДАКТИРОВАТЬ 2: Мой запрос должен выглядеть так!

<ShipmentRequest xmlns="https://plazaapi.bol.com/services/xsd/v2.1/plazaapi.xsd">
 <OrderItemId>1234567890</OrderItemId>
 <ShipmentReference>A321SR</ShipmentReference>
 <Transport>
   <TransporterCode>TNT</TransporterCode>
   <TrackAndTrace>3SBOL0987654321</TrackAndTrace>
 </Transport>
</ShipmentRequest>

РЕДАКТИРОВАТЬ 3: Я попытался заполнить JSONObject этими:

private JSONArray shipmentRequestArray = new JSONArray();
private JSONArray transportArray = new JSONArray();
private JSONObject requestObject = new JSONObject();

transportArray.add(new JSONObject().append("TransporterCode", transporter_Code));
transportArray.add(new JSONObject().append("TrackAndTrace", track_And_Trace));
shipmentRequestArray.add(new JSONObject().append("OrderItemId", orderItemIdTEST));
shipmentRequestArray.add(new JSONObject().append("ShipmentReference", shipment_Reference));
shipmentRequestArray.add(transportArray);

requestObject.put("ShipmentRequest", shipmentRequestArray);

И когда я попробовал это с:

.body(requestObject).asJson();

Я получаю новую ошибку: Не найден сериализатор для класса org.codehaus.jettison.json.JSONObject и не обнаружены свойства для создания BeanSerializer

РЕДАКТИРОВАТЬ 4: Мой пример ответа должен выглядеть так:

Status: 201 created

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:ProcessStatus xmlns:ns1="https://plazaapi.bol.com/services/xsd/v2/plazaapi.xsd">
 <ns1:id>1</ns1:id>
 <ns1:sellerId>1084486</ns1:sellerId>
 <ns1:entityId>1234567890</ns1:entityId>
 <ns1:eventType>CONFIRM_SHIPMENT</ns1:eventType>
 <ns1:description>Confirm shipment for order item 1234567890.</ns1:description>
 <ns1:status>PENDING</ns1:status>
 <ns1:createTimestamp>2016-02-17T17:30:00.142+01:00</ns1:createTimestamp>
 <ns1:Links>
   <ns1:link ns1:method="GET" ns1:href="https://plazaapi.bol.com/services/rest/process-status/v2/1234567" ns1:rel="self"/>
 </ns1:Links>
</ns1:ProcessStatus>

1 Ответ

0 голосов
/ 06 сентября 2018

Ошибка связана с неправильным типом объекта. Первый символ должен быть '[', но это не так - я думаю, это '{'.

Это потому, что вы выполняете array.get(0), который возвращает вам JSONObject, где требуется JSONArray.

UPD:

Я сделал некоторую отладку с дополнительной информацией, которую вы предоставили. Проблема заключалась в том, что Unirest.post возвращает объект класса RequestBodyEntity. Чтобы преобразовать его в json, сначала нужно получить тело ответа через getBody().

Вот что у меня сработало:

ShipmentRequest shipmentRequest = new ShipmentRequest();
shipmentRequest.setOrderItemId("1234567890");
shipmentRequest.setShipmentReference("A321SR");
ShipmentRequest.Transport transport = new ShipmentRequest.Transport();
transport.setTrackAndTrace("3SBOL0987654321");
transport.setTransporterCode("TNT");
shipmentRequest.setTransport(transport);

String jsonRequest = new Gson().toJson(shipmentRequest);
RequestBodyEntity result = Unirest.post("https://plazaapi.bol.com/services/rest/shipments/v2")
    .queryString(
       "access_token",
       "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJjaWQiOjMzMTgsInNlcSI6MSwidHlwIjoiYXBpIiwidnNuIjoxLCJuYmYiOjE1MTcyOTc2NjF9.hVdtwBfJAVfRVeBdf1XDAxe7Qpigwa0wmCvnF_Bicc8")
    .body(jsonRequest);
System.out.println(new Gson().fromJson(result.getBody().toString(), ShipmentRequest.class));

Вам нужно использовать result.getBody(), чтобы вернуть нужный объект. После этого вы можете сделать

System.out.println(result.getBody().toString()) 

чтобы распечатать или

new Gson().fromJson(result.getBody().toString(), ShipmentRequest.class)

для сохранения в объект типа ShipmentRequest.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...