- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 JSON 文件:
{
"settings": {
"header": {
"id": "240A64CDC43F",
"filename": "network",
"sequence": "0",
"last_modified": "2015-04-21T16:33",
"JSON_file_version": "2.1"
},
"data": {
"engine_config": {
"bed_name": "IdealTempCDC43F",
"provisioned": "false",
"connected": "false",
"IP_address": "192.168.10.1",
"connection_error": "None"
},
"networks": {
"available": "7",
"SSIDs": {
"wireless_1": {
"SSID": "$$ASI_WIFI$$",
"mac_address": "A0:EC:F9:11:35:04",
"channel": "11",
"RSSI": "-64dBm",
"security": "true",
"security_type": "WPA"
},
"wireless_2": {
"SSID": "$$ASI_GUEST$$",
"mac_address": "A0:EC:F9:11:35:02",
"channel": "11",
"RSSI": "-65dBm",
"security": "true",
"security_type": "WPA"
}
}
}
}
}
}
为了解析这个 json,我使用这个:
HttpResponse response = client.execute(request);
String strResponse = response.toString();
parseJSON(strResponse);
和
public void parseJSON(String jsonString) {
Gson gsonParser = new Gson();
ProveQuerySetting gsonResponse = new ProveQuerySetting();
Type collectionType = new TypeToken<Collection<ProveQuerySetting>>() {
}.getType();
gsonResponse = gsonParser.fromJson(jsonString, collectionType);
String str = gsonParser.toJson(gsonResponse);
System.out.println(" final json " + str);
}
但是我遇到了这个异常:
04-21 07:08:13.864: W/System.err(4187): com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 1 path $
04-21 07:08:13.864: W/System.err(4187): com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 1 path $
04-21 07:08:13.865: W/System.err(4187): at com.google.gson.Gson.fromJson(Gson.java:822)
04-21 07:08:13.865: W/System.err(4187): at com.google.gson.Gson.fromJson(Gson.java:775)
04-21 07:08:13.865: W/System.err(4187): at com.google.gson.Gson.fromJson(Gson.java:724)
04-21 07:08:13.865: W/System.err(4187): at com.easi.main.network.NetworkCom.parseJSON(NetworkCom.java:127)
04-21 07:08:13.865: W/System.err(4187): at com.easi.main.network.NetworkCom.sendFirst(NetworkCom.java:50)
04-21 07:08:13.865: W/System.err(4187): at com.easi.main.setting.ConnectToBox$MyAsyncTask.doInBackground(ConnectToBox.java:89)
04-21 07:08:13.865: W/System.err(4187): at com.easi.main.setting.ConnectToBox$MyAsyncTask.doInBackground(ConnectToBox.java:1)
04-21 07:08:13.865: W/System.err(4187): at android.os.AsyncTask$2.call(AsyncTask.java:288)
04-21 07:08:13.865: W/System.err(4187): at java.util.concurrent.FutureTask.run(FutureTask.java:237)
04-21 07:08:13.865: W/System.err(4187): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
04-21 07:08:13.865: W/System.err(4187): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
04-21 07:08:13.865: W/System.err(4187): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
04-21 07:08:13.865: W/System.err(4187): at java.lang.Thread.run(Thread.java:818)
04-21 07:08:13.865: W/System.err(4187): Caused by: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 1 path $
04-21 07:08:13.865: W/System.err(4187): at com.google.gson.stream.JsonReader.beginArray(JsonReader.java:350)
04-21 07:08:13.866: W/System.err(4187): at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:79)
04-21 07:08:13.866: W/System.err(4187): at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:60)
04-21 07:08:13.866: W/System.err(4187): at com.google.gson.Gson.fromJson(Gson.java:810)
04-21 07:08:13.866: W/System.err(4187): ... 12 more
这是我的 POJO 类:
public class ProveQuerySetting {
ProvQueryData provEngnData;
ProvQueryHeader provEngnhHeader;
public ProvQueryData getProvEngnData() {
return provEngnData;
}
public void setProvEngnData(ProvQueryData provEngnData) {
this.provEngnData = provEngnData;
}
public ProvQueryHeader getProvEngnhHeader() {
return provEngnhHeader;
}
public void setProvEngnhHeader(ProvQueryHeader provEngnhHeader) {
this.provEngnhHeader = provEngnhHeader;
}
}
为什么我会收到此异常?
最佳答案
好的,所以您正在尝试使用默认的 Gson。伟大的!默认的Gson是智能的,但不是那么智能。您必须将类设计为完全匹配您返回的 json 格式,或者使用 @SerializedName
注释,如果您不想设计自定义反序列化器。当我说完全匹配时,我的意思是,字段名称必须与序列化的Gson完全相同,无论是在字段名称还是在注释中。
我创建了以下 POJO(包括您的 POJO,并修改了字段名称)。为了简洁起见,我没有包含 getter/setter:
public class ProvEngineConfig {
private String bed_name;
private String provisioned;
private String connected;
private String IP_Address;
private String connection_error;
}
public class ProvNetworks {
private String available;
private Map<String, ProvSSID> SSIDs; // Notice this is a map
}
public class ProveQuerySetting {
ProvQueryData data;
ProvQueryHeader header;
}
public class ProvQueryData {
ProvEngineConfig engine_config;
ProvNetworks networks;
}
public class ProvQueryHeader {
String id;
String filename;
String sequence;
String last_modified;
String JSON_file_version;
}
public class ProvSSID {
String SSID;
String mac_address;
String channel;
String RSSI;
String security;
String security_type;
}
再次,您是否看到字段名称与 JSON 中的字段名称完全相同?请注意,在 ProvNetworks
中,我使用的是 map ,因为您提供的 JSON 是无线名称与完全匹配的 SSID 对象的 map 。
一旦我的 POJO 设置如下,另请注意,您提供的 JSON 不是 Collection
查询设置,它实际上是 Map<String, ProvQuerySetting>
,您从单词 "settings"
进行映射到引擎配置对象。所以我这样解析:
public static void parseJSON(String jsonString) {
Gson gsonParser = new Gson();
Map<String, ProveQuerySetting> gsonResponse; // You don't need to do new here
Type collectionType = new TypeToken<Map<String, ProveQuerySetting>>() {}.getType();
gsonResponse = gsonParser.fromJson(jsonString, collectionType);
String str = gsonParser.toJson(gsonResponse);
System.out.println(" final json " + str);
}
输出:
final json {"settings":{"data":{"engine_config":{"bed_name":"IdealTempCDC43F","provisioned":"false","connected":"false","connection_error":"None"},"networks":{"available":"7","SSIDs":{"wireless_1":{"SSID":"$$ASI_WIFI$$","mac_address":"A0:EC:F9:11:35:04","channel":"11","RSSI":"-64dBm","security":"true","security_type":"WPA"},"wireless_2":{"SSID":"$$ASI_GUEST$$","mac_address":"A0:EC:F9:11:35:02","channel":"11","RSSI":"-65dBm","security":"true","security_type":"WPA"}}}},"header":{"id":"240A64CDC43F","filename":"network","sequence":"0","last_modified":"2015-04-21T16:33","JSON_file_version":"2.1"}}}
<小时/>
您需要:
JsonReader
中所述。 关于java - 为什么我收到 JsonSyntaxException : Expected BEGIN_ARRAY but was STRING here?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29793314/
我正在开发一个通过 HTTPS POST 请求将数据导入 Web 服务的项目。为了创建 HTTPS 请求,我使用了 Retrofit2。这是我关于如何创建请求和评估响应的方法: 我正在创建一个对象来存
我遇到了 JSON 解析错误。我的代码如下: try { //Read the server response and attempt to parse it as JSON
我正在使用托管在 SmarterAsp.net 上的 ASP Web API 网络服务以 Json 格式获取数据以在我的 android 应用程序中使用它们,当我使用 Wifi 时一切正常并且 Jso
大家好,我正在制作一个 Android 应用程序,其中我收到 4 条错误消息: GSON 无法解析为类型 JsonSyntaxException 无法解析为类型 和另外2个 刚刚添加了gson-2.2
我最近决定使用 Android 的 Retrofit Library 来进行网络调用,并使用 GSON 来处理 JSON。但我不断收到以下异常,并且我的应用程序崩溃了。 Caused by: retr
我是retrofit的新手(我之前使用volley),在此之前我在retrofit方面做得很好,直到出现此错误:- com.google.gson.JsonSyntaxException: java.
我正在运行一些 Java 分析工具来进行 WES 分析。所以,我可以被认为是 Java 的新手 :( 顺便说一句,我使用 PharmCAT 来分析我的 VCF 文件。但我得到了这个错误: com.go
我有一个名为 DateTime 的自定义对象。我使用方法 registerTypeAdapter 注册 TypeAdapter 。我认为 GSON 忽略了这个适配器。 GSON如何检测json对象中的
我正在尝试使用 Gson 反序列化一个 json 数组,但目前我收到了一个 JsonSyntaxException。 json 字符串是由 .NET MVC3 Web 服务使用 JsonResult
正在测试一个抛出 JsonSyntaxException 的类,即使我期望抛出预期的错误,测试仍然失败。我的测试: @规则 公共(public) ExpectedException 异常 = Expe
我正在读取一个 Json 字符串并使用 scala 代码将其转换为一个对象: val myInstance = (new Gson()).fromJson(t, classOf[myClass]) 一
相关Question Json的响应是换行符Json: {"type":"data","id":"xyz"} {"type":"value","id":"xcf"} .... .... 我正在使用Re
我正在尝试复制 Google App Engine Servlet 模块 here使用 Retrofit 而不是 AsyncTask。 我觉得很奇怪,但显然 Retrofit 2.0 不支持连接到 G
我遇到了这个问题,我不想解决那个问题,但想办法告诉 GSON“跳过错误并继续”解析: Can't parses json : java.lang.IllegalStateException:
首先,我知道其他一些用户之前已经问过类似的问题,所以您可能认为这是一个重复的问题,但事实并非如此。 我想创建一个模型类来解析 GoogleMaps-Direction API 响应从 JSON 格式到
我是 gson 新手并收到此错误。 com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:预期为 BEGIN_OBJE
我正在获取一个 JSON 字符串,并希望将其转换为类型化对象。 但是我收到以下反序列化错误: 04-02 16:20:45.632: E/AndroidRuntime(30912): com.goog
我有一个 JSON 文件: { "settings": { "header": { "id": "240A64CDC43F", "filename": "net
我正在尝试使用其 Java 驱动程序测试 ArangoDB。我正在 CentOS 6.6 上测试它。我收到以下错误: 15:48:01.151 [main] DEBUG com.arangodb.ht
这个问题已经有答案了: Gson to json conversion with two DateFormat (3 个回答) 已关闭 6 年前。 我遇到以下异常 - com.google.gson.
我是一名优秀的程序员,十分优秀!