我正在开发一个自动注册屏幕并使用restful api来获取基于用户通知的CEP(邮政编码)的数据。 ('cep'是巴西邮政编码的名称)。Rest API + Json响应错误编码(我认为)
我正在经历的问题显然很容易解决。
当我调用rest api来获取有关地址的数据时,有时解决方案有效,有时候不行。
我得到的数据传递的网址:http://api.postmon.com.br/v1/cep/70040903
我的代码是:
package com.clubee.doggywalker;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import java.util.ArrayList;
import java.util.List;
/**
* Created by barcat on 6/24/15.
*/
public class cadastro_user extends ActionBarActivity {
//JSON node
private static final String TAG_SUCCESS = "success";
//url para cadastrar novo usuário
private static String url_cadastraCliente = "http://clubee.com.br/dev/dbDoggyWalker/DoggyWalker_CadastroUsuario_Inserir.php";
JSONParser jsonParser = new JSONParser();
EditText char_Nome;
EditText char_CEP;
EditText char_Email;
EditText char_Cidade;
EditText char_Estado;
EditText char_Logradouro;
EditText char_Endereco;
EditText char_Bairro;
//barra de progressão
private ProgressDialog pDialog;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.cadastro_user);
char_Nome = (EditText) findViewById(R.id.inputNome);
char_Email = (EditText) findViewById(R.id.inputEmail);
char_Logradouro = (EditText) findViewById(R.id.inputLogradouro);
char_Endereco = (EditText) findViewById(R.id.inputLogradouro2);
char_Cidade = (EditText) findViewById(R.id.inputCidade);
char_Estado = (EditText) findViewById(R.id.inputEstado);
char_Bairro = (EditText)findViewById(R.id.inputBairro);
char_CEP = (EditText) findViewById(R.id.inputCEP);
//Criar botão
Button btnCadastraUsuario = (Button) findViewById(R.id.btnCadastraUsuario);
Button btnBuscaCEP = (Button) findViewById(R.id.btnBuscaEndereco);
//Criar evento do botão
btnCadastraUsuario.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//abre thread em background
new CadastraCliente().execute();
}
});
//Criar evento do botão
btnBuscaCEP.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//abre thread em background
new HttpRequestTask().execute();
}
});
}
private class HttpRequestTask extends AsyncTask<Void, Void, Greeting> {
@Override
protected Greeting doInBackground(Void... params) {
try {
final String url = "http://api.postmon.com.br/v1/cep/"+char_CEP.getText();
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
Greeting greeting = restTemplate.getForObject(url, Greeting.class);
return greeting;
} catch (Exception e) {
Log.e("cadastro_user", e.getMessage(), e);
}
return null;
}
@Override
protected void onPostExecute(Greeting greeting) {
TextView greetingLogradouro = (TextView) findViewById(R.id.inputLogradouro);
TextView greetingEndereco = (TextView) findViewById(R.id.inputLogradouro2);
TextView greetingBairro = (TextView) findViewById(R.id.inputBairro);
TextView greetingCidade = (TextView) findViewById(R.id.inputCidade);
TextView greetingEstado = (TextView) findViewById(R.id.inputEstado);
TextView greetingCEP = (TextView) findViewById(R.id.inputCEP);
greetingLogradouro.setText(greeting.getLogradouro());
greetingEndereco.setText(greeting.getEndereco());
greetingCidade.setText(greeting.getCidade());
greetingBairro.setText(greeting.getBairro());
greetingEstado.setText(greeting.getEstado());
greetingCEP.setText(greeting.getCep());
}
}
class CadastraCliente extends AsyncTask<String, String, String> {
/**
* Before starting background thread Show Progress Dialog
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(cadastro_user.this);
pDialog.setMessage("Cadastrando usuário..");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}
/**
* Creating product
*/
protected String doInBackground(String... args) {
String Nome = char_Nome.getText().toString();
String Email = char_Email.getText().toString();
String Endereco = char_Logradouro.getText().toString();
String TipoLicenca = "Usuario";
// Building Parameters
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("char_Nome", Nome));
params.add(new BasicNameValuePair("char_Email", Email));
params.add(new BasicNameValuePair("char_Endereco", Endereco));
params.add(new BasicNameValuePair("char_TipoLicenca",TipoLicenca));
// getting JSON Object
// Note that create product url accepts POST method
JSONObject json = jsonParser.makeHttpRequest(url_cadastraCliente,
"POST", params);
// check log cat fro response
Log.d("Create Response", json.toString());
// check for success tag
try {
int success = json.getInt(TAG_SUCCESS);
if (success == 1) {
// successfully created product
Intent i = new Intent(getApplicationContext(), cadastro_user.class);
startActivity(i);
// closing this screen
finish();
} else {
// failed to create product
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
/**
* After completing background task Dismiss the progress dialog
* *
*/
protected void onPostExecute(String file_url) {
// dismiss the dialog once done
pDialog.dismiss();
}
}
}
吾道
package com.clubee.doggywalker;
import java.lang.ref.SoftReference;
/**
* Created by barcat on 6/26/15.
*/
public class Greeting {
private String logradouro;
private String cep;
private String bairro;
private String cidade;
private String estado;
private String complemento;
private String unidade;
private String endereco;
public String getBairro() {
return this.bairro;
}
public String getLogradouro() {
return this.logradouro;
}
public String getEndereco() {
return this.endereco;
}
public String getCidade() {
return this.cidade;
}
public String getCep() {
return this.cep;
}
public String getEstado() {
return this.estado;
}
public String getComplemento() {
return this.complemento;
}
public String getUnidade() {
return this.unidade;
}
}
唯一的例外是
06-27 19:35:11.696 5845-6029/com.clubee.doggywalke r E/cadastro_user:无法读取JSON:无法识别的字段“endereço”(类com.clubee.doggywalker.Greeting),未标记为可忽略(8个已知属性:“cidade”,“logradouro”,“bairro”,“estado” ,“complemento”,“endereco”,“cep”,“unidade”]) at [source:buffer(co[email protected]2ed70b18).inputStream();行:1,列:70](通过参考链:com.clubee.doggywalker.Greeting [“endereço”]);嵌套的异常是com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:无法识别的字段“endereço”(类com.clubee.doggywalker.Greeting),未标记为可忽略的(8个已知属性:“cidade”,“logradouro”,“bairro “),”estado“,”complemento“,”endereco“,”cep“,”unidade“]) at [source:buffer(co[email protected]2ed70b18).inputStream ;行:1,列:70](通过参考链:com.clubee.doggywalker.Greeting [“endereço”]) org.springframework.http.converter.HttpMessageNotReadableException:无法读取JSON:无法识别的字段“endereço”(类com (cluade),logradouro,bairro,estado,complemento,endereco,cep,unidade)), at [source:buffer(co[email protected]2ed70b18).inputStream();行:1,列:70](通过参考链:com.clubee.doggywalker.Greeting [“endereço”]);嵌套的异常是com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:无法识别的字段“endereço”(类com.clubee.doggywalker.Greeting),未标记为可忽略的(8个已知属性:“cidade”,“logradouro”,“bairro “),”estado“,”complemento“,”endereco“,”cep“,”unidade“]) at [source:buffer(co[email protected]2ed70b18).inputStream ;行:1,列:70](通过参考链:com.clubee.doggywalker.Greeting [“endereço”]) at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readInternal(MappingJackson2HttpMessageConverter.java:126) at org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.java:147) at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:76) at org.springframework.web.client.RestTemplate。在org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:237) 处执行(执行com.clubee.doggywalker.cadastro_user $ HttpRequestTask.d oInBackground(cadastro_user.java:97) at com.clubee.doggywalker.cadastro_user $ HttpRequestTask.doInBackground(cadastro_user.java:90) at android.os.AsyncTask $ 2.call(AsyncTask。java:297) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:231) at java.util.concurrent.ThreadPoolExecutor .runWorker(ThreadPoolExecutor.java:1112) at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:818) 引起:com .fasterxml.jackson.databind.exc.UnrecognizedPropertyException:无法识别的字段“endereço”(类com.clubee.doggywalker.Greeting),未标记为可忽略的(8个已知属性:“cidade”,“logradouro”,“bairro”,“estado “),”complemento“,”endereco“,”cep“,”unidade“]) at [source:buffer(co[email protected]2ed70b18).inputStream();行:1,列:70](通过参考链:com.clubee.doggywalker.Greeting [“endereço”]) at com.fasterxml.jackson.databind.DeserializationContext.reportUnknownProperty(DeserializationContext.java:671) at com。 fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:771) 在com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1297) 在com.fasterxml.jackson。 databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1275) 06-27 19:35:11.697 5845-5845/com.clubee.doggywalker D/AndroidRuntime:关闭VM 06-27 19:35:11.698 5845- 5845/com.clubee.doggywalker E/AndroidRuntime:致命例外:main 进程:com.clubee.doggywalker,PID: 5845 java.lang.NullPointerException:尝试在空对象引用 处调用虚拟方法'java.lang.String com.clubee.doggywalker.Greeting.getLogradouro()'com.clubee.doggywalker.cadastro_user $ HttpRequestTask.onPostExecute( cadastro_user.java:114) at com.clubee.doggywalker.cadastro_user $ HttpRequestTask.onPostExecute(cadastro_user.java:90) at android.os.AsyncTask.finish(AsyncTask.java:641) at android.os.AsyncTask。在android.os.Attributes.asp中获得$ 500(AsyncTask.java:177) $ InternalHandler.handleMessage(AsyncTask.java:658) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper .loop(Looper.java:211) at android.app.ActivityThread.main(ActivityThread.java:53 33) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1016) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811)
我测试了您的建议,但不起作用。 错误类似。 06-27 21:45:37.888 19627-19763/com.clubee.doggywalker E/cadastro_user:无法读取JSON:无法识别的字段 “endereco”(类com.clubee.doggywalker.Greeting),没有标记为可忽略(8已知属性: “CIDADE”, “logradouro”, “的Bairro”, “endereço”, “国家体制”, “complemento”, “CEP” 在[来源, “unidade”]) :缓冲液(com.android.okhttp.internal。 [email protected]).inputStream(); line:1,column:125](通过参考链:com.clubee.doggywalker.Greeting [“endereco”]); – Barcat
我写道:@JsonProperty(“endere \ u00e7o”) private String endereco; 公共字符串getEndereco(){ 返回this.endereco; } – Barcat
实际上,如果你看看你的数据(你发布的链接),你会发现数据包含 “endereco”和“endereço”,这可能是为什么它有时会起作用。 可能是你的数据流有时有endereço 尝试性质: @JsonIgnoreProperties(ignoreUnknown =真) 在你的类 – Joeblade