Eu tenho este método:
public static Object parseStringToObject(String json) {
String Object = json;
Gson gson = new Gson();
Object objects = gson.fromJson(object, Object.class);
parseConfigFromObjectToString(object);
return objects;
}
E eu quero analisar um JSON com:
public static void addObject(String IP, Object addObject) {
try {
String json = sendPostRequest("http://" + IP + ":3000/config/add_Object", ConfigJSONParser.parseConfigFromObjectToString(addObject));
addObject = ConfigJSONParser.parseStringToObject(json);
} catch (Exception ex) {
ex.printStackTrace();
}
}
Mas recebo uma mensagem de erro:
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: BEGIN_OBJECT esperado, mas estava STRING na linha 1 da coluna 1
Respostas:
Mesmo sem ver sua string JSON, você pode dizer pela mensagem de erro que não é a estrutura correta a ser analisada em uma instância da sua classe.
O Gson espera que sua string JSON comece com uma chave de abertura de objeto. por exemplo
Mas a cadeia que você passou para ela começa com aspas abertas
fonte
parseStringToObject
sugere que ele espera um objeto JSON, que sempre começa com{
.{"ip":"192.167.1.15"}
a partirRestful EJB web service with jboss EAP 7.1
do backend. No entanto, recebo "BEGIN_OBJECT esperado, mas estava STRING na linha 1 da coluna 1" Por favor, ajude-me ... Este é o meu serviço da web: @Stateless @Path ("/ getflashcard") classe pública GetFlashcard {@Interceptors (Validator.class) @GET @Produces (MediaType.APPLICATION_JSON) public String getFlashcard () {String jsonString = new JSONObject (). Put ("ip", "192.167.1.15"). ToString (); return jsonString; }}JSON inválido do servidor sempre deve ser um caso de uso esperado. Um milhão de coisas podem dar errado durante a transmissão. O Gson é um pouco complicado, porque sua saída de erro fornecerá um problema e a exceção real que você capturar será de um tipo diferente.
Com tudo isso em mente, a correção adequada no lado do cliente é
Se você quiser saber por que o JSON que você recebeu do servidor está errado, você pode olhar dentro do seu bloco catch na exceção. Mas, mesmo que seja o seu problema, não é responsabilidade do cliente corrigir o JSON que está recebendo da Internet.
De qualquer forma, é responsabilidade do cliente decidir o que fazer quando o JSON estiver ruim. Duas possibilidades são rejeitar o JSON e não fazer nada, e tentar novamente.
Se você tentar novamente, recomendo definir um sinalizador dentro do bloco try / catch e responder a esse sinalizador fora do bloco try / catch. Provavelmente, a tentativa / captura aninhada é como o Gson nos colocou nessa confusão, com o rastreamento da pilha e as exceções não correspondentes.
Em outras palavras, mesmo admitindo que não parece muito elegante, eu recomendaria
fonte
No Retrofit2, quando você deseja enviar seus parâmetros em bruto, deve usar escalares.
adicione primeiro no seu gradle:
my SampleActivity:
Referência: [ Como POST JSON inteiro bruto) no corpo de uma solicitação de Retrofit?
fonte
Talvez você
JSON Object
esteja certo, mas a resposta que você recebeu não é seus dados válidos. Assim como quando você conecta o inválidoWiFi
, você pode receber uma resposta estranha< html>.....< /html>
queGSON
não pode analisar.pode ser necessário fazer algo
try..catch..
para esta resposta estranha para evitar falhas.fonte
Eu vim para compartilhar uma solução. O erro aconteceu comigo depois de forçar o caderno a desligar. solução possível
clean preject
.fonte
Certifique-se de ter objetos desserializados, como DATE / DATETIME etc. Se você estiver enviando diretamente JSON sem desserializá-lo, poderá causar esse problema.
fonte
Na minha situação, eu tenho um "modelo", composto por vários parâmetros String, com exceção de um: é uma matriz de bytes
byte[]
. Algum trecho de código:A última linha acima é quando o
é acionado. Pesquisando no SO, percebi que precisava ter alguma forma de
Adapter
converter meuBaseModel
JsonObject para lá e para cá. A mistura deString
ebyte[]
em um modelo complica as coisas. Aparentemente,Gson
realmente não gosto da situação.Acabo fazendo um
Adapter
para garantir quebyte[]
seja convertido emBase64
formato. Aqui está a minhaAdapter
turma:Para converter JSONObject em modelo, usei o seguinte:
Da mesma forma, para converter o modelo em JSONObject, usei o seguinte:
O que o código está fazendo é basicamente enviar a classe pretendida
class/object
(nesse caso,byte[]
classe) para o momento emAdapter
que for encontrada durante a conversão em / para JSONObject.fonte
Não use
jsonObject.toString
em um objeto JSON.fonte
No meu caso, estou retornando o objeto JSON como
Resolvido alterando-o como
Aqui os dados são um sub JsonObject e devem começar em {not ""
fonte
se o seu formato json e as variáveis estiverem corretas, verifique as consultas do banco de dados ... mesmo que os dados sejam salvos no banco de dados corretamente, o problema real pode estar lá ... verifique novamente as consultas e tente novamente .. Espero que ajude
fonte
Não se esqueça de converter seu objeto em Json primeiro usando Gson ()
Então você pode facilmente convertê-lo novamente em um objeto usando esta incrível biblioteca
fonte