web-dev-qa-db-fra.com

BEGIN_OBJECT attendu mais BEGIN_ARRAY à la ligne 1 colonne 2 chemin $

J'essaie de lire et d'analyser une chaîne JSON qui commence comme un tableau (par exemple [{test: "test"}]) Et je continue à rencontrer l'erreur:

Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $

L'erreur dans mon journal pointe vers cette ligne:

Gson gson = new GsonBuilder().create();
PayoutCharges payoutList = gson.fromJson(reader, PayoutCharges.class);

Après quelques réponses de stackoverflow, j'ai créé la classe PayoutCharges en tant que liste de tableaux de PayoutCharge. Comment puis-je résoudre ce problème afin que GSON sache que la chaîne JSON est à l'intérieur d'un tableau?

PayoutCharges.Java

package com.app.driver.entity;

import Java.util.ArrayList;

import com.google.gson.annotations.SerializedName;

public class PayoutCharges {
    //handle error
    @SerializedName("error")
    private Error mError;

    public Error getError() {
        return mError;
    }

    public void setError(Error error) {
        mError = error;
    }

    //handle data
    @SerializedName("payoutCharges")
    private ArrayList<PayoutCharge> mPayoutCharges;

    public ArrayList<PayoutCharge> getPayoutCharges() {
        return mPayoutCharges;
    }

    public void setPayoutCharges(ArrayList<PayoutCharge> payoutCharges) {
        mPayoutCharges = payoutCharges;
    }
}

Après avoir lu la réponse de @ Ridcully, je veux demander s'il y a un moyen pour moi de mettre à jour PayoutCharges.Java Afin qu'il sache que le JSON est un tableau. Quelque chose comme @SerializedName([])?

21
Huy

Le code ci-dessous fonctionne pour votre exemple de valeur json:

String val1 = "[{test: \"test\"}]";

final GsonBuilder gsonBuilder = new GsonBuilder();
final Gson gson = gsonBuilder.create();

TestCase[] testCase = gson.fromJson(val1, TestCase[].class);

La classe de support TestCase:

private static class TestCase {
    @SerializedName("test")
    private String field;
}

L'exemple de test que vous avez partagé a un tableau qui contient des objets. Vous devez donc utiliser un tableau de votre classe pojo tout en désérialisant la valeur json en un objet (tableau).

Si cette réponse ne vous aide pas (ce qui signifie que vous avez quelque chose de différent sur votre vraie valeur json), vous devriez mieux partager le vrai json sur lequel vous travaillez.

30
Devrim

entrez la description de l'image ici ci-dessus est ce que je dois analyser; voici mon entité:

**package com.winway.ecloud.data.entity;

import Java.util.List;


public class WellSectionEntity {


        private String name;    

        private String picture;

        private String remark;  

        private List<Point> pos;    

        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getPicture() {
            return picture;
        }
        public void setPicture(String picture) {
            this.picture = picture;
        }
        public String getRemark() {
            return remark;
        }
        public void setRemark(String remark) {
            this.remark = remark;
        }
        public List<Point> getPos() {
            return pos;
        }
        public void setPos(List<Point> pos) {
            this.pos = pos;
        }

}
package com.winway.ecloud.data.entity;


public class Point {
    public float x;// 
    public float y;// 
    public float circleR = 50;//
    public float r;// 
    private String lineNO;// 
    private String lineName;// 
    private String no;// 
    private int deep;// 


    public float getX() {
        return x;
    }

    public void setX(float x) {
        this.x = x;
    }

    public float getY() {
        return y;
    }

    public void setY(float y) {
        this.y = y;
    }

    public float getR() {
        return r;
    }

    public float getCircleR() {
        return circleR;
    }

    public void setCircleR(float circleR) {
        this.circleR = circleR;
    }

    public void setR(float r) {
        this.r = r;
    }

    public String getLineNO() {
        return lineNO;
    }

    public void setLineNO(String lineNO) {
        this.lineNO = lineNO;
    }

    public String getLineName() {
        return lineName;
    }

    public void setLineName(String lineName) {
        this.lineName = lineName;
    }

    public String getNo() {
        return no;
    }

    public void setNo(String msg) {
        this.no = msg;
    }

    public int getDeep() {
        return deep;
    }

    public void setDeep(int deep) {
        this.deep = deep;
    }
}

final GsonBuilder gsonBuilder = new GsonBuilder();
        final Gson gson = gsonBuilder.create();

jsonTemp est une chaîne, qui comprend ce que j'énumère en tête de cet arcticle solution1:

WellSectionEntity[] listSection = gson.fromJson(***jsonTemp***, WellSectionEntity[].class);

solution2:

List<WellSectionEntity> sectionlist = gson.fromJson(jsonTemp, new TypeToken<List<WellSectionEntity>>(){}.getType());

merci DevrimTuncer.

2
F. Mark

Si vous définissez à nouveau le tableau d'objets PayoutCharge en tant que classe (PayoutCharges), votre JSON devrait ressembler à ceci:

{"error" : <... JSONified Error object>,
 "payoutCharges" : [{"test" : "test"}]
}
0
Ridcully