web-dev-qa-db-ja.com

"BEGIN_OBJECTが必要ですが、1行目1桁目がSTRINGでした。"

私はこの方法があります:

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でした

83
Crapo Wolf

JSON文字列が表示されなくても、エラーメッセージから、それがクラスのインスタンスに解析されるのに正しい構造ではないことがわかります。

GsonはあなたのJSON文字列がオブジェクトオープニングブレースで始まることを期待しています。例えば.

{

しかし、あなたがそれに渡した文字列は、開いている引用符で始まります。

"
128
bhspencer

サーバーからの無効な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)
{
  //...
11
Jessica Pennell

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全体をPOSTする方法

3
Raj008

あなたのJSON Objectは正しいのですが、受け取った応答があなたの有効なデータではありません。無効なWiFiを接続したときのように、GSONが解析できないという奇妙な応答< html>.....< /html>を受け取ることがあります。

クラッシュを避けるためにこの奇妙な反応のためにtry..catch..をする必要があるかもしれません。

2
BrantYu

解決策を共有するようになりました。 notbookをハングアップさせた後、エラーが発生しました。可能な解決策clean preject

1
Wallace Roberto

私の場合は、JSONオブジェクトを

{"データ": ""、 "メッセージ": "出席者の保存に成功しました.. !!!"、 "ステータス": "成功"}

次のように変更することで解決しました

{"データ":{}、 "メッセージ": "出席者の保存に成功しました.. !!!"、 "ステータス": "成功"}

ここでのデータはサブJsonObjectであり、{not ""から始まる必要があります。

あなたのJSONフォーマットと変数が大丈夫なら、あなたのデータベースクエリをチェックしてください。データが正しくdbに保存されていても、実際の問題はそこにあるかもしれません...クエリを再チェックしてもう一度試してください。

0
Shabbir Ahmed

DATE/DATETIMEなどのようにDESERIALIZEDオブジェクトがあることを確認してください。それをデシリアライズせずに直接JSONを送信している場合は、この問題が発生する可能性があります。

0
Ravi Wadje

JSONオブジェクトにjsonObject.toStringを使用しないでください。

0