代码之家  ›  专栏  ›  技术社区  ›  mukesh210

JsonSyntaxException Gson:应为BEGIN_对象,但为字符串

  •  0
  • mukesh210  · 技术社区  · 6 年前

    代码:

    import com.google.gson.Gson
    
    object DecryptQRData extends App {
    
      val key = "klix8TW3SMGtHLVO0ZbhwO8ggW0p+npHfB71epkvmE0="
      val data = "c3NbCs3KQ6uC9d1kplSOg78opMs5+jKB/n5O3D4ttLQaNfWeU/s3RxYqDMazA09gOhhUWkRHZo3xrsgv/x2zoQ=="
      val bytesArray: Array[Byte] = AES.decodeBase64(data)
      val finalData: Array[Byte] = AES.decrypt(bytesArray, key)
    
      val jsonString: String = new String(finalData)
      println(s"result: $jsonString")
      //result: "{\"username\": \"abc@gmail.com\",\"address\": \"!Earth\"}"
    
      val gson: Gson = new Gson()
      val extractedJson: User = gson.fromJson(jsonString, classOf[User])
      println(s"user is: ${extractedJson}")
    }
    
    case class User(username: String, address: String)
    

    以上代码失败,以下异常:

    result: "{\"username\": \"abc@gmail.com\",\"address\": \"!Earth\"}"
    Exception in thread "main" com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 2 path $
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:226)
        at com.google.gson.Gson.fromJson(Gson.java:927)
        at com.google.gson.Gson.fromJson(Gson.java:892)
        at com.google.gson.Gson.fromJson(Gson.java:841)
        at com.google.gson.Gson.fromJson(Gson.java:813)
        at DecryptQRData$.delayedEndpoint$DecryptQRData$1(DecryptQRData.scala:15)
        at DecryptQRData$delayedInit$body.apply(DecryptQRData.scala:3)
        at scala.Function0.apply$mcV$sp(Function0.scala:39)
        at scala.Function0.apply$mcV$sp$(Function0.scala:39)
        at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:17)
        at scala.App.$anonfun$main$1$adapted(App.scala:80)
        at scala.collection.immutable.List.foreach(List.scala:392)
        at scala.App.main(App.scala:80)
        at scala.App.main$(App.scala:78)
        at DecryptQRData$.main(DecryptQRData.scala:3)
        at DecryptQRData.main(DecryptQRData.scala)
    Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 2 path $
        at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:385)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:215)
        ... 15 more
    
    Process finished with exit code 1
    

    但当我替换

    val jsonString: String = new String(finalData)
    //jsonString contains "{\"username\": \"abc@gmail.com\",\"address\": \"!Earth\"}"
    


    val jsonString: String = "{\"username\": \"abc@gmail.com\",\"address\": \"!Earth\"}" ,我的程序运行并打印 User .

    jsonString

    编辑1:我尝试了下面的代码(删除了开头和结尾的引号)

    val jsonString: String = new String(finalData)
      println(s"jsonString: $jsonString")
      val removedQuotes = jsonString.replaceAll("^\"|\"$", "")
      println(s"removedQuotes: ${removedQuotes}")
      val gson: Gson = new Gson()
      val extractedJson: User = gson.fromJson(removedQuotes, classOf[User])
      println(s"user is: ${extractedJson}")
    

    但是,它也失败了,错误如下:

    jsonString: "{\"username\": \"abc@gmail.com\",\"address\": \"!Earth\"}"
    removedQuotes: {\"username\": \"abc@gmail.com\",\"address\": \"!Earth\"}
    Exception in thread "main" com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 2 path $.
    
    0 回复  |  直到 6 年前
        1
  •  2
  •   Michał Ziober    6 年前

    这是因为你 JSON 有效载荷看起来像:

    "{"username": "abc@gmail.com","address": "!Earth"}
    

    通知 " 一开始。当你第一次移除 "

    System.out.println("\"{}\"");
    System.out.println("{}");
    

    "{}"
    {}
    

    编辑

    System.out.println("Start point: " + json);
    json = json.substring(1, json.length() - 1);
    System.out.println("Get without \": " + json);
    json = json.replaceAll("\\\\\"", "\"");
    System.out.println("Valid: " + json);
    
    Gson gson = new Gson();
    User user = gson.fromJson(json, User.class);
    
    System.out.println(user);
    

    以上代码打印:

    Start point: "{\"username\": \"abc@gmail.com\",\"address\": \"!Earth\"}"
    Get without ": {\"username\": \"abc@gmail.com\",\"address\": \"!Earth\"}
    Valid: {"username": "abc@gmail.com","address": "!Earth"}
    User{username='abc@gmail.com', address='!Earth'}
    

    另请参见: