【问题标题】:Expected BEGIN_ARRAY but was BEGIN_OBJECT with an array of three elements预期为 BEGIN_ARRAY,但为 BEGIN_OBJECT,包含三个元素的数组
【发布时间】:2012-04-09 12:38:54
【问题描述】:

我正在开发 Android 3.1 及更高版本的应用程序。

我正在使用适用于 Android 的 Spring Framework 1.0.0.0RC1 和 Google GSon 2.1。

我在尝试解析 JSON 时遇到错误。

这是 "http://192.168.1.128/RestServiceImpl.svc/forms/" 返回的 JSON

{
    "allFormsResult": [
        {
            "FormId": 1,
            "FormName": "Formulario 1"
        },
        {
            "FormId": 2,
            "FormName": "Formulario 2"
        },
        {
            "FormId": 3,
            "FormName": "Formulario 3"
        }
    ]
}

在这里我什么都做:

public class FormSpringController
{
    public static List<Form> LoadAll()
    {
        HttpHeaders requestHeaders = new HttpHeaders();
        requestHeaders.setAccept(Collections.singletonList(new MediaType("application","json")));
        HttpEntity<?> requestEntity = new HttpEntity<Object>(requestHeaders);

        String url = "http://192.168.1.128/RestServiceImpl.svc/forms/";

        GsonHttpMessageConverter messageConverter = new GsonHttpMessageConverter();
        List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
        messageConverters.add(messageConverter);

        RestTemplate restTemplate = new RestTemplate();
        restTemplate.setMessageConverters(messageConverters);

        ResponseEntity<Form[]> responseEntity = restTemplate.exchange(url, HttpMethod.GET, requestEntity, Form[].class);
        Form[] result= responseEntity.getBody();

        return Arrays.asList(result);
    }
}

当我尝试解析它时,我收到以下错误:

W/System.err(519): Caused by: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2

你知道我该如何解决吗?

更新
@hotveryspicy 建议我 JSON 存在“问题”。这就是我生成 JSON 响应(C# 代码)的方式:

public class RestServiceImpl : IRestServiceImpl
{
    public List<FormContract> allForms()
    {
        List<FormContract> list = null;
        using (var vAdmEntities = new ADMDatabase.ADMEntities())
        {
            list = new List<FormContract>();
            foreach (var form in vAdmEntities.Form)
            {
                FormContract formC = new FormContract
                {
                    FormName = form.name.Trim(),
                    FormId = form.formId
                };
                list.Add(formC);
            }
        }

        return list;
    }
}

【问题讨论】:

    标签: android json spring gson


    【解决方案1】:

    因为您的字符串以“{”开头,这意味着它是一个对象(json 概念),您似乎将其视为一个数组,这是错误的。

    已编辑:

    {"data":
       {
        "allFormsResult": [
            {
                "FormId": 1,
                "FormName": "Formulario 1"
            },
            {
                "FormId": 2,
                "FormName": "Formulario 2"
            },
            {
                "FormId": 3,
                "FormName": "Formulario 3"
            }
        ]
      }
    }
    

    只需附加一个对象“数据”,然后继续解析。当 Json 将第一个元素作为数组“[”获取时,这是 Json 的问题。

    【讨论】:

    • 谢谢。我该如何解决?我可以修改该 Web 服务(使用 C# 和 WCF 制作),但我不知道如何修改。
    • Android 中如何使用 Gson 进行解析?
    • 由spring框架解析。我所有关于解析它的代码都显示在这里(在 LoadAll() 方法上)。
    • 我的意思是说你是如何使用Gson的?,响应是好的,但问题是在解析方面
    • 好的。我不知道如何在 Android 上解析 JSON,所以我遵循了这个例子:static.springsource.org/spring-android/docs/1.0.x/reference/…。我已经使用 Spring Framework 来完成这一切。
    猜你喜欢
    • 2019-05-10
    • 1970-01-01
    • 2014-08-01
    • 2015-11-26
    • 2018-03-27
    • 2016-08-20
    • 2019-06-14
    • 1970-01-01
    • 2015-07-24
    相关资源
    最近更新 更多