从远端获取JSON数据时,发现转换不了
这是返回的body示例
[
"{"Id": "LM1", "Type": 0, "Name": "LocationMark0", "Posture": [-0.589, -0.696, 0], "Property": [{"key": "spin", "type": "bool", "value": "ZmFsc2U=", "boolValue": false}]}",
"{"Id": "LM2", "Type": 0, "Name": "LocationMark1", "Posture": [5.836, -0.321, 0], "Property": [{"key": "spin", "type": "bool", "value": "ZmFsc2U=", "boolValue": false}]}"
]
@Test
void getLandMark() {
//result是用UTF8转换的结果 result就是上面的数组
String result = HttpClientUtils.doGet(apiProperties.getMapInfourl(), apiProperties.getQueryLandmarks(), null);
List<LandMark> landMarks;
if (StringUtils.isEmpty(result)) {
//去除转义符未错,实体类转换错了(但是我惊奇的发现,去除转义符前后没变)
landMarks = JSONObject.parseArray(String.valueOf(JSON.parse(result)), LandMark.class);
System.out.println(landMarks);
}
}
我的实体类是这样子的
@Data
public class LandMark implements Serializable {
private static final long serialVersionUID = 1L;
private String id;
private String name;
private List<Double> posture;
private Integer type;
private List<Property> property;
}
@Data
public class Property implements Serializable {
private static final long serialVersionUID = 1L;
private String key;
private String value;
private String type;
private boolean boolValue;
}
com.alibaba.fastjson.JSONException: syntax error, expect {, actual [, pos 0
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:233)
at com.alibaba.fastjson.parser.deserializer.ASMJavaBeanDeserializer.parseRest(ASMJavaBeanDeserializer.java:101)
at Fastjson_ASM_LandMark_1.deserialze(Unknown Source)
at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:556)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:251)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:227)
按照实体类获取 如果不能按照实体类获取,那就想个办法获取,我自己转实体类也行
根据报错可以知道,你的json格式有问题。
把返回字符串改成如下,才能调用JSONObject.parseArray
[
{"Id": "LM1", "Type": 0, "Name": "LocationMark0", "Posture": [-0.589, -0.696, 0], "Property": [{"key": "spin", "type": "bool", "value": "ZmFsc2U=", "boolValue": false}]},
{"Id": "LM2", "Type": 0, "Name": "LocationMark1", "Posture": [5.836, -0.321, 0], "Property": [{"key": "spin", "type": "bool", "value": "ZmFsc2U=", "boolValue": false}]}"
]
兄弟你这就成绩太差了把,几行代码的事 ,就是JSON字符串转成list对象
public class TestJson {
public static void main(String[] args) {
String dataJson = "[\n" +
"{\"Id\": \"LM1\", \"Type\": 0, \"Name\": \"LocationMark0\", \"Posture\": [-0.589, -0.696, 0], \"Property\": [{\"key\": \"spin\", \"type\": \"bool\", \"value\": \"ZmFsc2U=\", \"boolValue\": false}]},\n" +
"{\"Id\": \"LM2\", \"Type\": 0, \"Name\": \"LocationMark1\", \"Posture\": [5.836, -0.321, 0], \"Property\": [{\"key\": \"spin\", \"type\": \"bool\", \"value\": \"ZmFsc2U=\", \"boolValue\": false}]}\n" +
"]";
JSONArray jsonArray = JSONObject.parseArray(dataJson);
if (jsonArray.isEmpty()) {
return;
}
List<LandMark> landMarkList = JSONObject.parseArray(jsonArray.toJSONString(), LandMark.class);
System.out.println("json转成list对象: " + JSONObject.toJSON(landMarkList));
}
}
修改后的代码如下:
@Test
void getLandMark() {
//result是用UTF8转换的结果 result就是上面的数组
String result = HttpClientUtils.doGet(apiProperties.getMapInfourl(), apiProperties.getQueryLandmarks(), null);
List<LandMark> landMarks;
if (StringUtils.isEmpty(result)) {
//去除转义符未错,实体类转换错了(但是我惊奇的发现,去除转义符前后没变)
List<String> jsonArr = JSON.parseArray(result, String.class);
landMarks = jsonArr.stream().map(s->JSON.parse(result,LandMark.class)).collect(Collectors.toList());
System.out.println(landMarks);
}
}
如有帮助,请采纳,十分感谢!
主要是在你的Json格式的问题,重新格式化了一次
[
{
"Id": "LM1",
"Type": 0,
"Name": "LocationMark0",
"Posture": [
-0.589,
-0.696,
0
],
"Property": [
{
"key": "spin",
"type": "bool",
"value": "ZmFsc2U=",
"boolValue": false
}
]
},
{
"Id": "LM2",
"Type": 0,
"Name": "LocationMark1",
"Posture": [
5.836,
-0.321,
0
],
"Property": [
{
"key": "spin",
"type": "bool",
"value": "ZmFsc2U=",
"boolValue": false
}
]
}
]
运行结果
json格式有问题,如果非要处理的话,可以多转换一次即可。
1、遇到这种json传参问题,先在线检验json格式是否正确,如图
2、此时首先需要修改成正确的格式。你的数据中中括号[ ]后面不需要双引号
3、格式检验工具:直接搜在线json校验即可
这格式有问题,随便用哪个json校验工具看一下,
String s7="你的那个数据";
if(s7.contains("\"{")){
System.out.println(true);
s7=s7.replace("\"{","{");
}
if(s7.contains("}\"")){
s7=s7.replace("}\"","}");
}
if(s7.contains("\n")){
s7=s7.replace("\n","");
}
System.out.println(s7);
JSONArray jsonArray=JSON.parseArray(s7);
System.out.println(jsonArray);
JSONObject.parseArray(String.valueOf(JSON.parse(result)), LandMark.class);
换成
JSONArray.parseArray(JSONArray.toJSONString(result), LandMark.class);
你引用json包处理