Mam taką metodę:
public static Object parseStringToObject(String json) {
String Object = json;
Gson gson = new Gson();
Object objects = gson.fromJson(object, Object.class);
parseConfigFromObjectToString(object);
return objects;
}
Chcę przeanalizować JSON za pomocą:
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();
}
}
Ale pojawia się komunikat o błędzie:
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: oczekiwano BEGIN_OBJECT, ale było STRING w linii 1 w kolumnie 1
Odpowiedzi:
Nawet nie widząc swojego ciągu JSON, możesz stwierdzić po komunikacie o błędzie, że nie jest to poprawna struktura do przeanalizowania w instancji Twojej klasy.
Gson oczekuje, że ciąg JSON zaczyna się od nawiasu otwierającego obiekt. na przykład
Ale przekazany ciąg znaków zaczyna się od cudzysłowu
źródło
parseStringToObject
sugeruje, że oczekuje obiektu JSON, który zawsze zaczyna się od{
.{"ip":"192.167.1.15"}
zRestful EJB web service with jboss EAP 7.1
zaplecza. Jednak pojawia się komunikat „Oczekiwano BEGIN_OBJECT, ale był STRING w linii 1, kolumna 1”. Pomóż mi ... To moja usługa internetowa: @Stateless @Path ("/ getflashcard") klasa publiczna 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; }}Nieprawidłowy kod JSON z serwera powinien zawsze być oczekiwanym przypadkiem użycia. Milion rzeczy może się nie udać podczas transmisji. Gson jest trochę skomplikowany, ponieważ jego wyjście błędu da jeden problem, a rzeczywisty złapany wyjątek będzie innego typu.
Mając to wszystko na uwadze, właściwą poprawką po stronie klienta jest
Jeśli chcesz wiedzieć, dlaczego kod JSON otrzymany z serwera jest nieprawidłowy, możesz zajrzeć do bloku catch w wyjątek. Ale nawet jeśli jest to twój problem, klient nie jest odpowiedzialny za naprawianie JSON, które otrzymuje z Internetu.
Tak czy inaczej, to klient jest odpowiedzialny za podjęcie decyzji, co zrobić, gdy pojawi się zły JSON. Dwie możliwości to odrzucenie JSON i nic nie robienie i ponowna próba.
Jeśli masz zamiar spróbować ponownie, bardzo polecam ustawienie flagi wewnątrz bloku try / catch, a następnie udzielenie odpowiedzi na tę flagę poza blokiem try / catch. Zagnieżdżone try / catch to prawdopodobnie sposób, w jaki Gson wpuścił nas w ten bałagan, ponieważ nasz ślad stosu i wyjątki nie pasują do siebie.
Innymi słowy, chociaż przyznam, że nie wygląda to zbyt elegancko, polecam
źródło
W Retrofit2, jeśli chcesz przesłać parametry w formacie RAW, musisz użyć skalarów.
najpierw dodaj to w swoim gradle:
moja SampleActivity:
Odniesienie: [ Jak POSTOWAĆ nieprzetworzony cały kod JSON w treści żądania modernizacji?
źródło
Może masz
JSON Object
rację, ale odpowiedź, którą otrzymałeś, nie jest poprawnymi danymi, tak jak przy podłączaniu nieprawidłowegoWiFi
, możesz otrzymać dziwną odpowiedź< html>.....< /html>
,GSON
której nie można przeanalizować.może być konieczne zrobienie
try..catch..
tej dziwnej odpowiedzi, aby uniknąć awarii.źródło
Przyszedłem podzielić się rozwiązaniem. Wystąpił błąd po zmuszeniu notatnika do rozłączenia się. możliwe rozwiązanie
clean preject
.źródło
Upewnij się, że masz DESERIALIZOWANE obiekty, takie jak DATE / DATETIME itp. Jeśli bezpośrednio wysyłasz JSON bez deserializacji, może to spowodować ten problem.
źródło
W mojej sytuacji mam „model”, składający się z kilku parametrów String, z wyjątkiem jednego: jest to tablica bajtów
byte[]
. Jakiś fragment kodu:Ostatnia linia powyżej dotyczy pliku
jest wyzwalany. Przeszukując SO, zdałem sobie sprawę, że potrzebuję jakiejś formy
Adapter
konwersjiBaseModel
do i z JsonObject. MieszanieString
ibyte[]
w modelu komplikuje sprawę. Widocznie,Gson
nie podoba mi się ta sytuacja.W końcu robię,
Adapter
aby upewnić się, żebyte[]
zostanie przekonwertowany doBase64
formatu. Oto mojaAdapter
klasa:Aby przekonwertować JSONObject na model, użyłem:
Podobnie, aby przekonwertować model na JSONObject, użyłem:
Zasadniczo kod polega na przepchnięciu zamierzonej
class/object
(w tym przypadkubyte[]
klasy) przez plikAdapter
każdym razem, gdy zostanie napotkana podczas konwersji do / z JSONObject.źródło
Nie używaj
jsonObject.toString
na obiekcie JSON.źródło
W moim przypadku zwracam obiekt JSON jako
Rozwiązano, zmieniając go jako
Tutaj dane są podrzędnym obiektem JsonObject i powinny zaczynać się od {nie ""
źródło
jeśli format json i zmienne są w porządku, sprawdź zapytania bazy danych ... nawet jeśli dane są poprawnie zapisane w bazie danych, może tam być rzeczywisty problem ... sprawdź ponownie swoje zapytania i spróbuj ponownie .. Mam nadzieję, że to pomoże
źródło
Nie zapomnij najpierw przekonwertować swojego obiektu na Json za pomocą Gson ()
Następnie możesz łatwo przekształcić go z powrotem w obiekt za pomocą tej niesamowitej biblioteki
źródło
Miałem przypadek, w którym czytałem z odręcznego pliku JSON. JSON jest doskonały. Jednak ten błąd wystąpił. Więc piszę z obiektu java do pliku json, a następnie czytam z tego pliku json. wszystko jest w porządku. Nie widziałem żadnej różnicy między odręcznym jsonem a tym z obiektu java. Wypróbowany poza tym, że nie widzi różnicy. W końcu zauważyłem, że dwa rozmiary plików są nieco inne i użyłem narzędzia winHex i wykryłem dodatkowe rzeczy. Więc rozwiązaniem dla mojej sytuacji jest skopiowanie dobrego pliku json, wklejenie do niego treści i użycie.
źródło