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

JsonSyntaxException Gson:应为BEGIN_对象,但为字符串,json,scala,encryption,gson,Json,Scala,Encryption,Gson,我一直在尝试解密json数据,然后使用GSON将其转换为Scala case类 代码: 上述代码失败,但出现以下异常: result: "{\"username\": \"abc@gmail.com\",\"address\": \"!Earth\"}" Exception in thread "main" com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but

我一直在尝试解密json数据,然后使用GSON将其转换为Scala case类

代码:

上述代码失败,但出现以下异常:

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=“{\”用户名\:\”abc@gmail.com\“,”地址\“:\“!Earth\”}”
,我的程序工作并打印
用户

问题:当两个字符串都包含相同的数据时,为什么用实际数据替换
jsonString

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

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

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 $.

这是因为您的
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'}
另见:


JSON
不能从
开始“
。请确保开头和结尾没有任何引号,如果它们存在,请删除它们。@MichałZiober我使用
replaceAll(“^\”\“$”,”)
替换了
jsonString
,但它也给出了相同的错误。不要替换所有
只是第一个。是的。。。正则表达式将只替换第一个和最后一个“
”,当您在开始删除“
”时,它看起来也很奇怪。这是一个有效的
JSON
{“用户名”:abc@gmail.com“,”地址“:“!Earth”}
我尝试删除开头和结尾的引号,但不起作用。我添加了有问题的示例代码。@Mukeshprajapati,请查看我的编辑。这是
Java
中如何将无效的
payload
转换为有效的
JSON
的一个示例。你可以改进它,但它显示了它必须做些什么才能使它工作。
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'}