使用Retrofit2的Android Studio上JSON中位置0的意外令牌#错误

时间:2019-05-07 06:23:27

标签: android firebase

我有一个问题,“ JSON在位置0出现意外的令牌#”。

我想做的是在Firebase上使用CloudFunction删除FirebaseUser。

没有返回,但是错误提示“有意外的json令牌#”

这是一些代码:

  • CloudFunctionsService(接口)
public interface CloudFunctionsService {

    @POST("deleteUser")
    Call<Void> deleteUser(@Body String uid);
}

  • FunctionRetrofit(RetrofitClass)
public class FunctionRetrofit {
    private static FunctionRetrofit instance = new FunctionRetrofit();

    public static FunctionRetrofit getInstance(){
        return instance;
    }

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(url)
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    private CloudFunctionsService cfs = retrofit.create(CloudFunctionsService.class);
    public CloudFunctionsService getService(){
        return cfs;
    }

}
  • function deleteUser(在FirebaseCloudFunction上)
exports.deleteUser = functions.https.onRequest((req, res) => {
    if (req.body.uid === undefined) {
      res.status(400).send('No user id defined');
    } else {
      var userId = req.body.uid;

      admin.auth().deleteUser(userId)
          .then(function() {
              console.log("Successfully deleted user");    
          })
          .catch(error=> {
              console.log("Error deleting user: ", error);
          });

      res.status(200).end();
    } 
  });

  • 代码执行(活动) 结果就是成功,但实际上什么都没改变
Call<Void> res = FunctionRetrofit.getInstance().getService().deleteUser(user.getUid());
                res.enqueue(new Callback() {
                    @Override
                    public void onResponse(Call call, Response response) {
                        Log.d("success", "suceess");

                    }

                    @Override
                    public void onFailure(Call call, Throwable t) {
                        Log.e("Error", t.getMessage().toLowerCase());
                    }
                });

  • 错误
SyntaxError: Unexpected token # in JSON at position 0
    at JSON.parse (<anonymous>)
    at createStrictSyntaxError (/worker/node_modules/body-parser/lib/types/json.js:157:10)
    at parse (/worker/node_modules/body-parser/lib/types/json.js:83:15)
    at /worker/node_modules/body-parser/lib/read.js:121:18
    at invokeCallback (/worker/node_modules/raw-body/index.js:224:16)
    at done (/worker/node_modules/raw-body/index.js:213:7)
    at IncomingMessage.onEnd (/worker/node_modules/raw-body/index.js:273:7)
    at emitNone (events.js:106:13)
    at IncomingMessage.emit (events.js:208:7)
    at endReadableNT (_stream_readable.js:1064:12)

1 个答案:

答案 0 :(得分:3)

使用GsonConverterFactory时,我认为使用@Body批注时期望json(或序列化为JSON)。当您传递原始String值时,我认为这是错误所在。

请忽略上面的答案。 GsonConverterFactory会将您自己的Type序列化为JSON,但是您要发送的是原始String值。这将不会被序列化,因此ID为3的帖子的正文将为“ 3”-我认为您正在调用deleteUser的api期望的是您未发送的正文中的JSON,这就是您收到错误的原因。我将检查您正在制作的Firebase API调用的文档,以查看其期望帖子正文采用的格式。它更有可能是这样的:

{
    "userId": "3"
}

如果是这种情况,那么您将需要一个类:

public class User {
    private String userId;

    public User(String userId){
        this.userId  = userId;
    }
}

当您可能期望{表示开始JSON对象时,您当前正在发送一个字符作为第一个字符