com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: ожидаемый BEGIN_OBJECT, но был BEGIN_ARRAY в строке 1, путь 2 столбца $ - PullRequest
0 голосов
/ 09 октября 2018

Хорошо, я прочитал еще пару вопросов с этой же ошибкой, но ни на один из них не было получено ответа, и я не могу заставить его работать.Я подключаюсь к Google In-App Billing и у меня все настроено, но, когда я пытаюсь вытащить свои skudetails (у меня там сейчас 2 SKU), я получаю сообщение об ошибке - Ожидается BEGIN_OBJECT, но в столбце строки 1 была BEGIN_ARRAY2 path $

У меня есть класс модели SubscriptionActivity, Result (сериализуемый) и Details (сериализуемый).Ниже приведен код, любая помощь будет отличной, спасибо -

Из подписки активность:

Gson gson = new Gson();
try {
    Result result = gson.fromJson(skuDetailsList.toString(), Result.class);
    if (result != null) {
        for (Details d : result.getDetails()) {
            System.out.println(d.getProductId()
                + " \n " + d.getTitle() + " \n " + d.getDescription() + " \n "
                + d.getPrice());
        }
    }
} catch (NumberFormatException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

Из деталей модели:

public class Details implements Serializable{

    @SerializedName("productId")
    @Expose
    private String productId;
    @SerializedName("type")
    @Expose
    private String type;
    @SerializedName("price")
    @Expose
    private String price;
    @SerializedName("price_amount_micros")
    @Expose
    private Integer priceAmountMicros;
    @SerializedName("price_currency_code")
    @Expose
    private String priceCurrencyCode;
    @SerializedName("subscriptionPeriod")
    @Expose
    private String subscriptionPeriod;
    @SerializedName("freeTrialPeriod")
    @Expose
    private String freeTrialPeriod;
    @SerializedName("title")
    @Expose
    private String title;
    @SerializedName("description")
    @Expose
    private String description;

    public String getProductId() {
        return productId;
    }

    public void setProductId(String productId) {
        this.productId = productId;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }

    public Integer getPriceAmountMicros() {
        return priceAmountMicros;
    }

    public void setPriceAmountMicros(Integer priceAmountMicros) {
        this.priceAmountMicros = priceAmountMicros;
    }

    public String getPriceCurrencyCode() {
        return priceCurrencyCode;
    }

    public void setPriceCurrencyCode(String priceCurrencyCode) {
        this.priceCurrencyCode = priceCurrencyCode;
    }

    public String getSubscriptionPeriod() {
        return subscriptionPeriod;
    }

    public void setSubscriptionPeriod(String subscriptionPeriod) {
        this.subscriptionPeriod = subscriptionPeriod;
    }

    public String getFreeTrialPeriod() {
        return freeTrialPeriod;
    }

    public void setFreeTrialPeriod(String freeTrialPeriod) {
        this.freeTrialPeriod = freeTrialPeriod;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

}

Из результата деятельности:

public class Result implements Serializable{
    @SerializedName("SkuDetails")
    @Expose
    private ArrayList<Details> details = new ArrayList<Details>();
    /**
     *
     * @return The SkuDetails
     */
    public ArrayList<Details> getDetails() {
        return details;
    }
    /**
     *
     * @param details
     * The details
     */
    public void setDetails(ArrayList<Details> details) {
        this.details = details;
    }
}*

Оу ... и ответ, который я пытался проанализировать (skuDetailsList.toString ()):

[
    SkuDetails: {
        "productId": "basic_sub",
        "type": "subs",
        "price": "$0.99",
        "price_amount_micros": 990000,
        "price_currency_code": "USD",
        "subscriptionPeriod": "P1M",
        "freeTrialPeriod": "P4W2D",
        "title": "Basic Subscription Service (DadBod Recipes)",
        "description": "Basic Subscription Service for DadBodRecipes"
    },
    SkuDetails: {
        "productId": "enterprise_sub",
        "type": "subs",
        "price": "$2.99",
        "price_amount_micros": 2990000,
        "price_currency_code": "USD",
        "subscriptionPeriod": "P1M",
        "freeTrialPeriod": "P4W2D",
        "title": "Enterprise Subscription Service (DadBod Recipes)",
        "description": "Enterprise Subscription Service for DadBodRecipes"
    }
]

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Вы пытаетесь разобрать свой json

[

как

{

, когда видите [он представляетсписок

, когда вы видите {он представляет объект.

Я почти уверен, что вы знаете, что, когда вы создали класс-оболочку, ваш класс-оболочка также является объектом, а не объектом.массив.

Таким образом, вы можете сделать так, чтобы ваш класс-оболочка расширял ArrayList или некоторую форму List.

Или

Скажите конвертеру Json, что база - это массив, и выхотите, чтобы первый объект в списке был объектом вашего типа.

0 голосов
/ 09 октября 2018

Проблема в том, что полученный результат выглядит как <<strong> Key-Value > pair (не как объект / массив JSON, но похож на него) .

Итак, сначала вам нужно будет сделать JSONObject, а затем проанализировать его, используя Gson, как показано ниже:

Map<String, String> params = skuDetailsList;
JSONObject object = new JSONObject(params);
Result result = gson.fromJson(object.toString(), Result.class);

Сделайте так, надеюсь, это поможет!

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