J'ai cette méthode:
public static Object parseStringToObject(String json) {
String Object = json;
Gson gson = new Gson();
Object objects = gson.fromJson(object, Object.class);
parseConfigFromObjectToString(object);
return objects;
}
Et je veux analyser un JSON avec:
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();
}
}
Mais j'obtiens un message d'erreur:
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: BEGIN_OBJECT attendu mais était STRING à la ligne 1 colonne 1
Réponses:
Même sans voir votre chaîne JSON, vous pouvez dire à partir du message d'erreur que ce n'est pas la structure correcte à analyser dans une instance de votre classe.
Gson s'attend à ce que votre chaîne JSON commence par une accolade ouvrante d'objet. par exemple
Mais la chaîne que vous lui avez passée commence par des guillemets ouverts
la source
parseStringToObject
suggère qu'il attend un objet JSON, qui commence toujours par{
.{"ip":"192.167.1.15"}
deRestful EJB web service with jboss EAP 7.1
dans le backend. Cependant, j'obtiens "BEGIN_OBJECT attendu mais était STRING à la ligne 1 colonne 1" S'il vous plaît, aidez-moi ... Voici mon service Web: @Stateless @Path ("/ getflashcard") public class 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; }}Le JSON non valide du serveur doit toujours être un cas d'utilisation attendu. Un million de choses peuvent mal tourner pendant la transmission. Gson est un peu délicat, car sa sortie d'erreur vous posera un problème, et l'exception réelle que vous attrapez sera d'un type différent.
Avec tout cela à l'esprit, la solution appropriée du côté client est
Si vous voulez savoir pourquoi le JSON que vous avez reçu du serveur est incorrect, vous pouvez regarder à l'intérieur de votre bloc catch à l'exception. Mais même si c'est votre problème, il n'est pas de la responsabilité du client de corriger le JSON qu'il reçoit d'Internet.
Dans tous les cas, il est de la responsabilité du client de décider quoi faire en cas de mauvais JSON. Deux possibilités sont de rejeter le JSON et de ne rien faire, et de réessayer.
Si vous comptez réessayer, je vous recommande fortement de définir un indicateur à l'intérieur du bloc try / catch, puis de répondre à cet indicateur en dehors du bloc try / catch. L'essai / capture imbriquée est probablement la façon dont Gson nous a mis dans ce désordre avec notre trace de pile et les exceptions ne correspondant pas.
En d'autres termes, même si j'admets que cela n'a pas l'air très élégant, je recommanderais
la source
Dans Retrofit2, lorsque vous souhaitez envoyer vos paramètres bruts, vous devez utiliser Scalars.
ajoutez d'abord ceci dans votre note:
mon SampleActivity:
Référence: [ Comment POSTER JSON entier brut dans le corps d'une demande de Retrofit?
la source
Peut-être que vous avez
JSON Object
raison, mais la réponse que vous avez reçue ne correspond pas à vos données valides. Tout comme lorsque vous connectez l'invalideWiFi
, vous pouvez recevoir une réponse étrange< html>.....< /html>
quiGSON
ne peut pas analyser.vous devrez peut-être en faire quelques-uns
try..catch..
pour cette réponse étrange afin d'éviter un crash.la source
Je suis venu partager une solution. L'erreur m'est arrivée après avoir forcé le notbook à raccrocher. solution possible
clean preject
.la source
Assurez-vous que vous avez des objets DÉSERIALISÉS comme DATE / DATETIME, etc. Si vous envoyez directement JSON sans le désérialiser, cela peut causer ce problème.
la source
Dans ma situation, j'ai un "modèle", composé de plusieurs paramètres String, à l'exception d'un: c'est un tableau d'octets
byte[]
. Un extrait de code:La dernière ligne ci-dessus est quand le
est déclenché. En cherchant dans le SO, j'ai réalisé que je devais avoir une forme de
Adapter
conversion de monBaseModel
aller et retour dans un JsonObject. Avoir mélangéString
etbyte[]
dans un modèle complique les choses. Apparemment,Gson
je n'aime pas vraiment la situation.Je finis par faire un
Adapter
pour m'assurer qu'ilbyte[]
est converti auBase64
format. Voici maAdapter
classe:Pour convertir JSONObject en modèle, j'ai utilisé ce qui suit:
De même, pour convertir le modèle en JSONObject, j'ai utilisé ce qui suit:
Ce que fait le code est essentiellement de pousser la classe voulue
class/object
(dans ce cas, labyte[]
classe) àAdapter
chaque fois qu'elle est rencontrée lors de la conversion vers / depuis JSONObject.la source
Ne pas utiliser
jsonObject.toString
sur un objet JSON.la source
Dans mon cas, je renvoie un objet JSON en tant que
Résolu en le changeant comme
Ici, les données sont un sous JsonObject et elles devraient commencer à partir de {pas ""
la source
si votre format json et vos variables sont corrects, vérifiez vos requêtes de base de données ... même si les données sont correctement enregistrées dans la base de données, le problème réel peut être là-dedans ... revérifiez vos requêtes et réessayez .. J'espère que cela vous aidera
la source
N'oubliez pas de convertir d'abord votre objet en Json en utilisant Gson ()
Ensuite, vous pouvez facilement le reconvertir en objet en utilisant cette bibliothèque géniale
la source
J'ai eu un cas où j'ai lu à partir d'un fichier json manuscrit. Le json est parfait. Cependant, cette erreur s'est produite. J'écris donc à partir d'un objet java vers un fichier json, puis je lis à partir de ce fichier json. tout va bien. Je n'ai pas vu de différence entre le json manuscrit et celui de l'objet java. Essayé au-delàComparez il ne voit aucune différence. J'ai finalement remarqué que les deux tailles de fichiers étaient légèrement différentes, et j'ai utilisé l'outil winHex et détecté des trucs supplémentaires. Donc, la solution pour ma situation est de faire une copie du bon fichier json, d'y coller le contenu et de l'utiliser.
la source