私はこの方法があります:
public static Object parseStringToObject(String json) {
String Object = json;
Gson gson = new Gson();
Object objects = gson.fromJson(object, Object.class);
parseConfigFromObjectToString(object);
return objects;
}
そして、私はJSONをパースしたいのです。
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();
}
}
しかし、私はエラーメッセージが出ます:
com.google.gson.JsonSyntaxException:Java.lang.IllegalStateException:BEGIN_OBJECTが必要ですが、1行目1列目がSTRINGでした
JSON文字列が表示されなくても、エラーメッセージから、それがクラスのインスタンスに解析されるのに正しい構造ではないことがわかります。
GsonはあなたのJSON文字列がオブジェクトオープニングブレースで始まることを期待しています。例えば.
{
しかし、あなたがそれに渡した文字列は、開いている引用符で始まります。
"
サーバーからの無効なJSONは常に予想される使用例です。伝送中に何百万もの問題が発生する可能性があります。 Gsonはそのエラー出力が1つの問題をあなたに与えるので、そして少しあなたが捕まえる実際の例外が異なるタイプのものになるので、Gsonは少し巧妙です。
これらすべてを念頭に置いて、クライアント側の適切な修正は
try
{
gson.fromJSON(ad, Ad.class);
//...
}
catch (IllegalStateException | JsonSyntaxException exception)
{
//...
サーバーから受け取ったJSONが間違っている理由を知りたい場合は、例外をキャッチブロックの内側で見ることができます。しかし、それがあなたの問題であっても、インターネットから受け取っているJSONを修正するのはクライアントの責任ではありません。
いずれにせよ、それが悪いJSONになったときに何をするべきかを決めるのはクライアントの責任です。 2つの可能性は、JSONを拒否して何もしないで、もう一度やり直すことです。
もう一度試す場合は、try/catchブロック内でフラグを設定してから、try/catchブロック外でそのフラグに応答することを強くお勧めします。ネストしたtry/catchは、スタックトレースと例外が一致しないために、Gsonがこの混乱に陥った方法です。
言い換えれば、私はそれが非常にエレガントに見えないことを認めても、私はお勧めします
boolean failed = false;
try
{
gson.fromJSON(ad, Ad.class);
//...
}
catch (IllegalStateException | JsonSyntaxException exception)
{
failed = true;
//...
}
if (failed)
{
//...
Retrofit 2では、パラメータをrawで送信したいときはScalarsを使わなければなりません。
まずあなたのgradleにこれを追加してください。
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:converter-scalars:2.3.0'
public interface ApiInterface {
String URL_BASE = "http://10.157.102.22/rest/";
@Headers("Content-Type: application/json")
@POST("login")
Call<User> getUser(@Body String body);
}
私のSampleActivity:
public class SampleActivity extends AppCompatActivity implements Callback<User> {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sample);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(ApiInterface.URL_BASE)
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
ApiInterface apiInterface = retrofit.create(ApiInterface.class);
// prepare call in Retrofit 2.0
try {
JSONObject paramObject = new JSONObject();
paramObject.put("email", "[email protected]");
paramObject.put("pass", "4384984938943");
Call<User> userCall = apiInterface.getUser(paramObject.toString());
userCall.enqueue(this);
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onResponse(Call<User> call, Response<User> response) {
}
@Override
public void onFailure(Call<User> call, Throwable t) {
}
}
あなたのJSON Object
は正しいのですが、受け取った応答があなたの有効なデータではありません。無効なWiFi
を接続したときのように、GSON
が解析できないという奇妙な応答< html>.....< /html>
を受け取ることがあります。
クラッシュを避けるためにこの奇妙な反応のためにtry..catch..
をする必要があるかもしれません。
解決策を共有するようになりました。 notbookをハングアップさせた後、エラーが発生しました。可能な解決策clean preject
。
私の場合は、JSONオブジェクトを
{"データ": ""、 "メッセージ": "出席者の保存に成功しました.. !!!"、 "ステータス": "成功"}
次のように変更することで解決しました
{"データ":{}、 "メッセージ": "出席者の保存に成功しました.. !!!"、 "ステータス": "成功"}
ここでのデータはサブJsonObjectであり、{not ""から始まる必要があります。
あなたのJSONフォーマットと変数が大丈夫なら、あなたのデータベースクエリをチェックしてください。データが正しくdbに保存されていても、実際の問題はそこにあるかもしれません...クエリを再チェックしてもう一度試してください。
DATE/DATETIMEなどのようにDESERIALIZEDオブジェクトがあることを確認してください。それをデシリアライズせずに直接JSONを送信している場合は、この問題が発生する可能性があります。
JSONオブジェクトにjsonObject.toString
を使用しないでください。