2015-06-27 107 views
0

我正在开发一个自动注册屏幕并使用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)

回答

1

在你的问候类,你必须:

private String endereco; 

但在你的你有数据

"endere\u00e7o": "SBN Quadra 1 Bloco C" 

哪个不匹配。

从注释文档:

@JsonProperty("firstName") 
public String _first_name; 

见(fasterXML annotations) 所以你可能需要导入fasterXML注释,并将其添加到属性

@JsonProperty("endere\u00e7o") 
private String endereco; 

我不知道多么容易这是在android中,但我认为它应该工作。 它应该然后解析。

A“好玩”的替代方法是检查这个计算器的问题:unicode variable names

,并使用

private String endere\u00e7o; 

,但我只尝试了这一点兴趣,我不认为这是很好的做法是使用变量名像;)

....

或(正如我在评论中列出)看起来有时你endereco(与cedille没有)在您的输入流。

不理你可以在上面把这个任何不可映射属性:

@JsonIgnoreProperties(ignoreUnknown = true) 

这将忽略任何无法映射属性。当然,检查您的数据流并检查是否始终存在endereco(不含cedille),那么忽略unicode版本应该是安全的。

+0

我测试了您的建议,但不起作用。 错误类似。 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

+0

我写道:@JsonProperty(“endere \ u00e7o”) private String endereco; 公共字符串getEndereco(){ 返回this.endereco; } – Barcat

+0

实际上,如果你看看你的数据(你发布的链接),你会发现数据包含 “endereco”和“endereço”,这可能是为什么它有时会起作用。 可能是你的数据流有时有endereço 尝试性质: @JsonIgnoreProperties(ignoreUnknown =真) 在你的类 – Joeblade