簡體   English   中英

在有效的Json上Volley JSONArray解析錯誤

[英]Volley JSONArray parsing error on valid Json

我正在嘗試從ac#Web api解析此JsonString:

[{
"LimiteCredito": 123.00,
"PessoasFuncionarioId": 16,
"Id": 12,
"Nome": "Cliente PF A",
"DataEdicao": "\/Date(1485019536610-0200)\/",
"UsuarioAlteracaoId": "cdf23118-5991-4eb5-9ec4-ea1fc6e6ce3a",
"RazaoSocial": "Cliente PF A",
"Tipo": 1,
"Cpf": "80158536991   ",
"Sexo": "M",
"TelefonePrincipal": "(41) 9999-9999",
"Email": "comercial@datasig.com.br",
"EstadoRgId": 2,
"Apelido": "Cliente PF A",
"Erp10Id": 1,
"GrupoCrCpId": 1
}, {
    "LimiteCredito": 100.00,
    "PessoasFuncionarioId": 13,
    "Id": 15,
    "Nome": "cliente teste 3",
    "DataEdicao": "\/Date(1484849276613-0200)\/",
    "UsuarioAlteracaoId": "cdf23118-5991-4eb5-9ec4-ea1fc6e6ce3a",
    "RazaoSocial": "cliente teste 3",
    "Tipo": 2,
    "Cnpj": "20720218000128    ",
    "InscricaoEstadual": "ISENTO",
    "TelefonePrincipal": "(0",
    "Email": "cliente3@email.com.br",
    "Apelido": "cliente teste 3",
    "InscricaoMunicipal": "ISENTO",
    "Erp10Id": 1,
    "GrupoCrCpId": 1
}, {
    "LimiteCredito": 3.00,
    "Id": 43,
    "Nome": "asadvadv",
    "DataEdicao": "\/Date(1487379145870-0200)\/",
    "UsuarioAlteracaoId": "cdf23118-5991-4eb5-9ec4-ea1fc6e6ce3a",
    "RazaoSocial": "asadvadv",
    "Tipo": 1,
    "Cpf": "01234567890   ",
    "Rg": "2.231.232",
    "Sexo": "M",
    "TelefonePrincipal": "(34) 11313-1313",
    "TelefoneSecundario": "(13) 13434-1341",
    "Email": "341341341dfdf",
    "Observacao": "wdgwrg",
    "Inativa": true,
    "EstadoRgId": 1,
    "Apelido": "tes te",
    "Erp10Id": 1
}]

使用此代碼會引發兼容性錯誤:“這不是JSONArray”

public class RegrasClienteMixForteHelper extends Request<JSONArray> {
    private Response.Listener<JSONArray> response;
    private Map<String, String> params;

    public RegrasClienteMixForteHelper(int method, String url, Map<String, String> params, Response.Listener<JSONArray> response, Response.ErrorListener listener) {
        super(method, url, listener);
        this.params = params;
        this.response = response;
    }

    public Map<String, String> getParams() throws AuthFailureError {
        return params;
    }

    public Map<String, String> getHeaders() throws AuthFailureError {
        HashMap<String, String> header = new HashMap<String, String>();
        header.put("apiKey", "application/json");

        return (header);
    }

    @Override
    protected Response<JSONArray> parseNetworkResponse(NetworkResponse response) {
        try {

            String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
            JSONArray jsonArray = new JSONArray(jsonString);// ERROR -> this is not a JSONArray, same for JSONObject
            return Response.success(jsonArray, HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
    }


    @Override
    protected void deliverResponse(JSONArray response) {
        this.response.onResponse(response);
    }
}

該代碼是從我的Activity類調用的:

public class TesteRequisicaoActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_teste_requisicao);

        url = "myUrl";
        queue = Volley.newRequestQueue(TesteRequisicaoActivity.this);

        callByJsonArrayRequest(null);

    }

    // CALLS VOLLEY
    public void callByJsonArrayRequest(View view) {
        Map<String, String> params = new HashMap<String, String>();
        params.put("UserName", "userDemo");
        params.put("Password", "12345678");

        RegrasClienteMixForteHelper request = new RegrasClienteMixForteHelper(Request.Method.POST, url, params, new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray response) {
                Log.i("Script", "SUCCESS: " + response);
            }
        },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Toast.makeText(TesteRequisicaoActivity.this, "Error: " + error.getMessage(), Toast.LENGTH_LONG).show();
                    }
                });

        request.setTag("tag");
        queue.add(request);
    }

    @Override
    public void onStop() {
        super.onStop();

        queue.cancelAll("tag");
    }

我嘗試使用new Gson.parse(string).getAsJsonArray()解析相同的錯誤,使用new JSONObject(string)解析相同的錯誤,但我現在不知道該怎么辦。

有人可以解釋我該怎么辦以及為什么會這樣嗎? 因為響應是有效的Json。

更多信息 :

  • Web api的響應編碼是默認編碼(我沒有更改);
  • json沒有換行符和制表符\\n\\t ;

所以,畢竟我更改了最后一件事,即DateTime序列化處理,我使用以下序列化了:

 private string Json(object anything)
 {
    return JsonConvert.SerializeObject(anything, Formatting.None, new JsonSerializerSettings()
    {
        ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
        ConstructorHandling = ConstructorHandling.Default,
        DateFormatHandling = DateFormatHandling.IsoDateFormat,//Before : MicrosoftDateFormat
        DefaultValueHandling = DefaultValueHandling.Ignore,
        NullValueHandling = NullValueHandling.Ignore,
        ObjectCreationHandling = ObjectCreationHandling.Replace,
        PreserveReferencesHandling = PreserveReferencesHandling.None,
        CheckAdditionalContent = false
    });
}

我使用這種方法來格式化我的HTTP響應:

private HttpResponseMessage Response(object response)
{
     return new HttpResponseMessage()
    {
        Content = new StringContent(
                            Json(response),
                            System.Text.Encoding.UTF8,
                            "application/json"
                            )
    };
}

畢竟我在api控制器中的操作如下所示:

[HttpPost]
[Route("Clientes")]
public HttpResponseMessage GetClientes([FromBody]WebAuthModel model)
{
    SetUser(model);
    return Response(db.MyEntities.ToList().Select(x => GenericCreator.GetModel(x)));
}

這將為截擊框架生成一個可解析的Json。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM