【问题标题】:when syncing webservices with SQLite, array and object error appear使用 SQLite 同步 web 服务时,出现数组和对象错误
【发布时间】:2017-05-15 04:20:30
【问题描述】:

我正在尝试将我的 json 数据导入我的 sqlite,从 web 服务到 android。

这是我开始同步时遇到的错误。

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

错误出现在这块代码上。

 public String processSync(String response) {
    String status = FAILED;
    try {
        String formattedData = getFormattedData(response);
        final GsonBuilder gsonBuilder = new GsonBuilder();
        final Gson gson = gsonBuilder.create();
        ProductDataBean[] productDataBeanArray = gson.fromJson(formattedData, ProductDataBean[].class);
        AdministratorHelper administratorHelper = new AdministratorHelper();
        status = administratorHelper.insertProductData(context, productDataBeanArray);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return status;
}

AdministratorHelper.java

public class AdministratorHelper {

DBLiteUtils dbLiteUtils;
AdministratorDao dao = new AdministratorDao();

public String insertProductData(Context context, ProductDataBean[] productDataBeanArray){
    String status = FAILED;
    try{
        dbLiteUtils = new DBLiteUtils(context);
        dbLiteUtils.open();
        status = dao.insertProductData(dbLiteUtils, productDataBeanArray);
    } catch (Exception e){
        e.printStackTrace();
    } finally {
        dbLiteUtils.close();
    }
    return status;
}

AdministratorDao.java

public class AdministratorDao {

private Cursor cursor;

//Insert Product Details into SQLite
public String insertProductData(DBLiteUtils dbLiteUtils, ProductDataBean[] productDataBeanArray){
    String status = FAILED;
    try {
        if(productDataBeanArray.length > 0) {
            //Delete Existing Data
            dbLiteUtils.deleteAll("ProductMaster");

            //Base Insert Query for inserting New Data into ProductMaster Table
            String query = "INSERT INTO ProductMaster(ItemId, Description, Barcode, TransStatusCode) VALUES ";
            //Iterate the productDataBeanArray in order to get productDataBean which contains a single product details
            for (ProductDataBean productDataBean : productDataBeanArray) {
                //Concatenate the Base Insert Query and the product details
                query = query+"('"+productDataBean.getItemId().trim()+"', '"+productDataBean.getDescription().trim().replace("\'", "\'\'")+"', '"+productDataBean.getBarcode().trim()+"', '"+productDataBean.getTransStatusCode().trim()+"'),"; //.trim() removes unwanted empty spaces
            }
            //Remove the last comma from the iterated complete query
            query = query.substring(0, query.length()-1);
            //execute the query
            dbLiteUtils.executeQuery(query);
            //return  success
            status = SUCCESS;
        }
    } catch (Exception e){
        e.printStackTrace();
    }
    return status;
}

这是我在 Visual Studio 中获取 json 数据的代码

 public class ProductController : ApiController
{

    public IEnumerable<Product> Get()
    {
        List<Product> pproducts;
        using (estocktakeEntities entities = new estocktakeEntities())
        {

            pproducts = entities.Products.ToList();
            //return entities.products.ToList();

        }
        return pproducts;

    }

这是我的 json 示例

[{"invtid":"02007997","ib_itemcode1":"0","transstatuscode":"IN","descr":"潘婷 C/C 重症监护面膜 6 x 150m"}, {"invtid":"1","ib_itemcode1":"1","transstatuscode":"IN","descr":"object1"},{"invtid":"13101336","ib_itemcode1":"47400179172" ,"transstatuscode":"IN","descr":"Gillette Mach 3 Dispenser 8S (X12)"}, {"invtid":"13101473","ib_itemcode1":"47400179349","transstatuscode":"IN","descr":"Gillette Mach3 Cart 4S (X12)

如果需要更多信息,请告诉我,我会非常愿意上传。

感谢您的宝贵时间。

编辑 1

在尝试调试后,我遇到了这个错误,仍然不确定它是否有用,但这里是错误和与之相关的代码。

{"Message":"发生错误。","ExceptionMessage":"值不能为空。\r\n参数名称:实体","ExceptionType":"System.ArgumentNullException","StackTrace":"在 System.Data.Entity.Utilities.Check.NotNull[T](T value, String parameterName)\r\n 在 System.Data.Entity.DbSet`1.Add(TEntity entity)\r\n 在 ProductServiceFinal.Controllers .ProductController.Post(Product productrecord)"}

ProductController.Post

   public HttpResponseMessage Post([FromBody] Product productrecord)
    {
        try
        {
            using (estocktakeEntities entities = new estocktakeEntities())
            {
                entities.Products.Add(productrecord);
                //entities.Entry(productrecord).State = System.Data.Entity.EntityState.Modified;

                entities.SaveChanges();

                var message = Request.CreateResponse(HttpStatusCode.Created, productrecord);
                message.Headers.Location = new Uri(Request.RequestUri + productrecord.invtid.ToString());
                return message;
            }

        }
        catch (Exception ex)
        {
            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex);
        }
    }

【问题讨论】:

  • 你能用完整的 JSON 更新这个问题吗?
  • 这似乎是一个 Gson 错误。你能检查这一行` ProductDataBean[] productDataBeanArray = gson.fromJson(formattedData, ProductDataBean[].class); `;试试ProductDataBean.class 而不是ProductDataBean[].class
  • @PedroRodrigues 嗨,先生,我的完整杰森有 4000 多条记录。它是一样的,它会以 }] 结束。
  • @RustFisher 您好,先生,我尝试将其更改为 productDataBean 但是我的“状态 = administratorHelper.insertProductData(context, productDataBeanArray);”将导致错误。我会更新并显示所有链接
  • @phan 关于 SQLite,我猜ContentResolver 可能会有所帮助:)

标签: android json web-services sqlite


【解决方案1】:

错误日志是:com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 所以我猜问题是 JSON 正文,它是提供的 Web 服务。

 public String processSync(String response) {
    String status = FAILED;
    try {
        String formattedData = getFormattedData(response);
        final GsonBuilder gsonBuilder = new GsonBuilder();
        final Gson gson = gsonBuilder.create();
        ProductDataBean[] productDataBeanArray = gson.fromJson(formattedData, ProductDataBean[].class);
        AdministratorHelper administratorHelper = new AdministratorHelper();
        status = administratorHelper.insertProductData(context, productDataBeanArray);
    } catch (Exception e) {
        Log.e("tag",formattedData); // log out this JSON
        e.printStackTrace();
    }
    return status;
}

而EDIT 1 告诉我问题可能出现在网络服务中。 (我猜 Web 服务返回了错误的 JSON)。
我的建议是在 Android 项目中添加一些“容错”代码。
根本原因可能在 Web 服务中。

【讨论】:

  • 谢谢先生的建议,我会去看看容错,同时用我的网络服务更新这篇文章
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多