2014-10-20 144 views
19

我試圖讀取並解析其開始作爲一個數組JSON字符串(如[{test: "test"}])和我一直運行到錯誤:

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

的錯誤在我的日誌指向該行:

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

經過一些計算器的答案,我創建了PayoutCharges類作爲PayoutCharge數組列表。 如何解決此問題,以便GSON知道JSON字符串在數組內?

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; 
    } 
} 

閱讀@ Ridcully的響應後,我想問問,如果有對我更新PayoutCharges.java,這樣它知道JSON是一個數組的方式。像@SerializedName([])

回答

25

下面的代碼適用於您的樣品JSON值:

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

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

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

TestCase持有人類別:

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

您共享的測試示例具有包含對象的數組。所以你必須在將json值反序列化爲一個對象(數組)的同時使用pojo類的數組。

如果這個答案對您沒有幫助(這意味着您的真實json值有所不同),您應該更好地分享您正在使用的真正的json。

+0

Tuncer你救了我的一天。感謝您的解決方案 – PPD 2015-03-14 07:06:57

+0

簡單但很好的例子,這解決了我的問題!,謝謝 – RoDo 2016-02-17 12:30:49

+0

謝謝你的工作 – 2017-09-26 11:56:32

0

如果再次定義PayoutCharge對象的數組作爲一個類(PayoutCharges),你的JSON應該是這個樣子:

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

是有我的方式,以保持JSON作爲是(iOS應用也使用JSON響應,所以我必須避免操縱它)? – Huy 2014-10-20 18:46:10

-1

要小心gson.fromJson()的第二個參數,它需要一個數組類。例如data []。class。

+0

雖然是正確的,但這並沒有比已經接受的答案增加任何東西,這更加詳細。嘗試回答最近的問題,理想情況下還沒有回答。 – Benjamin 2016-07-06 12:32:28

0

enter image description here 以上是我需要解析的; 這裏是我的實體:

**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是一個字符串,其中包含我列出這個本arcticle的頭 解決方法1:

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

溶液2:

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

謝謝DevrimTuncer。

-2

這是因爲對象中第二列的名稱和類型與解析的數據發生衝突。如果您沒有數據中的某個數據,可以將其寫入最後一列。

image description

+0

而不是屏幕截圖,最好是將代碼作爲文本提供給代碼塊 – 2016-08-30 09:17:28

+0

或者您可以檢查一下符號是否正確,比如「[[」的錯誤符號 或者您可以檢查是否有正確的符號,例如「free 「錯誤符號 – keinta 2016-08-30 09:21:52

相關問題