String 字符串转实体类问题,尝试多次都不行

问题遇到的现象和发生背景

从远端获取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));

    }
}

img

img

修改后的代码如下:

    @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
            }
        ]
    }
]

运行结果

img

img

json格式有问题,如果非要处理的话,可以多转换一次即可。

1、遇到这种json传参问题,先在线检验json格式是否正确,如图

img

2、此时首先需要修改成正确的格式。你的数据中中括号[ ]后面不需要双引号

3、格式检验工具:直接搜在线json校验即可

这格式有问题,随便用哪个json校验工具看一下,

img

img

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包处理