FastJSON将LIST转JSON之后有反斜杠

本文介绍了一个Spring Boot服务中使用FastJSON将CustomerPlaformShopVO和OrderBondedInfoVO对象转换为JSON时遇到的反斜杠问题,提供了解决方案和关键代码片段.

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

FastJSON将LIST转JSON之后有反斜杠

@Service
@Slf4j
public class LiJingDeliverApi {
    public RetStatus<Object> deliver(CustomerPlaformShopVO customerPlaformVO, OrderBondedInfoVO orderBondedInfoVO) {
        RetStatus<Object> retStatus = new RetStatus<>();
        try{
            //params系统参数   值要定义成Object 不然下面转JSON会有反斜杠
            Map<String, Object> header = new HashMap<>();
            header.put("app_key", customerPlaformVO.getF_app_id());
            header.put("v", "1.0");
            header.put("timestamp", LiJingUtils.getNowTime());
            header.put("order_id", orderBondedInfoVO.getF_batch_no());

            List<OrderGoods> orderGoods = new ArrayList<>();
            for (OrderBondedGoodsVO orderBondedGoodsVO : orderBondedInfoVO.getOrderBondedGoodsVOS()) {
                OrderGoods orderGood = new OrderGoods();
                //平台商品编码
                orderGood.setGoods_no(orderBondedGoodsVO.getF_goods_pre_no());
                orderGood.setLogistics_name("快递名称");
                orderGood.setLogistics_code("快递编码");
                orderGood.setWay_bill_no(orderBondedInfoVO.getF_express_no());
                orderGood.setDelivery_time(orderBondedInfoVO.getF_send_time());
                orderGoods.add(orderGood);
            }

//            这里赋值的时候转成JSONArray不会有反斜杠
            header.put("order_goods", JSONArray.parseArray(JSONObject.toJSONString(orderGoods)));
            header.put("sign", MD5Utils.getMD5(customerPlaformVO.getF_app_secret()
                    + LiJingUtils.createLinkString(header)
                    + customerPlaformVO.getF_app_secret()).toUpperCase());
            String deliverOrder = LiJingUtils.sendPost(LiJingUtils.deliverUrl ,JSONObject.toJSONString(header));
            DeliverOrder deliverInfo = JSONObject.parseObject(deliverOrder, DeliverOrder.class);
            if (!StringUtils.equals(deliverInfo.getStatus(),"1")) {
                retStatus.set(1, "订单号:" + deliverInfo.getOrder_id() + ",回传失败:" + deliverInfo.getNote());
                return retStatus;
            }
        } catch (Exception e){
            retStatus.set(1, "回传异常.");
            e.printStackTrace();
        }
        return retStatus;
    }
}
public class LiJingUtils {

//    物流回传地址
    public static final String deliverUrl="http://api.orders.logistics";

//    获取现在的时间
    public static String getNowTime() {
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
    }

//    获取指定天数之前的时间
    public static String getSpecificTime(int day) {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //        现在的时间
        Date nowDate = new Date();
        Calendar cal = Calendar.getInstance();
        cal.setTime(nowDate);
        cal.add(Calendar.DAY_OF_MONTH, day);
        Date time = cal.getTime();
        return df.format(time);
    }

    public static String createLinkString(Map<String, Object> params) {
        List<String> keys = new ArrayList<>(params.keySet());
        Collections.sort(keys);
        String prestr = "";
        for(int i = 0; i < keys.size(); ++i) {
            String key = keys.get(i);
            //Map的value是Object要toString
            String value = params.get(key).toString();
//            如果value为空的话 不参与拼接(结合实际需求)
            if (StringUtils.isBlank(value)) {
                continue;
            }
            prestr = prestr + key + value;
        }
        return prestr;
    }

//body JSON格式的请求体
    public static String sendPost(String url, String body) {
        String response = null;
        try {
            CloseableHttpClient httpclient = null;
            CloseableHttpResponse httpresponse = null;
            try {
                httpclient = HttpClients.createDefault();
                HttpPost httppost = new HttpPost(url);
                StringEntity stringentity = new StringEntity(body, ContentType.create("application/json", "UTF-8"));
                httppost.setEntity(stringentity);
                //发post请求
                httpresponse = httpclient.execute(httppost);
                //utf-8参数防止中文乱码
                response = EntityUtils.toString(httpresponse.getEntity(), "utf-8");
            } finally {
                if (httpclient != null) {
                    httpclient.close();
                }
                if (httpresponse != null) {
                    httpresponse.close();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return response;
    }
}
//排序 拼接URL参数(记录)
public static String createLinkString(Map<String, String> params) throws UnsupportedEncodingException {
        List<String> keys = new ArrayList(params.keySet());
        Collections.sort(keys);
        String prestr = "";

        for(int i = 0; i < keys.size(); ++i) {
            String key = (String)keys.get(i);
            String value = (String)params.get(key);
            if(StringUtils.isBlank(value)){
                continue;
            }
            if (i == keys.size() - 1) {
                prestr = prestr + key + "=" + URLEncoder.encode(value,"utf-8");
            } else {
                prestr = prestr + key + "=" + URLEncoder.encode(value,"utf-8") + "&";
            }
        }

        return prestr;
    }
//sendPost 请求头请求体(记录)
//body JSON格式的请求体
public static String sendPost(String url, Map<String, String> headers, String body) {
        String response = null;
        try {
            CloseableHttpClient httpclient = null;
            CloseableHttpResponse httpresponse = null;
            try {
                httpclient = HttpClients.createDefault();
                HttpPost httppost = new HttpPost(url);
                StringEntity stringentity = new StringEntity(body, ContentType.create("application/json", "UTF-8"));
                httppost.setEntity(stringentity);
                // 循环添加header
                Iterator headerIterator = headers.entrySet().iterator();
                while (headerIterator.hasNext()) {
                    Entry<String, String> elem = (Entry<String, String>) headerIterator.next();
                    httppost.addHeader(elem.getKey(), elem.getValue());
                }
                //发post请求
                httpresponse = httpclient.execute(httppost);
                //utf-8参数防止中文乱码
                response = EntityUtils.toString(httpresponse.getEntity(), "utf-8");
            } finally {
                if (httpclient != null) {
                    httpclient.close();
                }
                if (httpresponse != null) {
                    httpresponse.close();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return response;
    }
<think>好的,用户现在问的是如何用Fastjson将字符串"[\"Android\",\"iOS\",\"HarmonyOS\"]"换成List<String>。之前用户已经问过Java数组和字符串的换,现在具体到使用Fastjson库处理JSON字符串到List换,说明用户可能在处理JSON数据,需要更高效的解析方法。 首先,我需要回顾用户的历史对话。之前我提供了使用Jackson和Gson的方法,用户现在可能想比较不同库的使用,或者项目中已经使用了Fastjson,所以需要特定的解决方案。用户可能在实际开发中遇到了类似的问题,需要具体的代码示例。 接下来,我需要确保回答的结构清晰,符合用户的要求。用户希望步骤明确,代码示例正确,并且可能需要注意事项和常见问题的解决方法。用户可能对Fastjson不熟悉,所以需要详细说明步骤,比如添加依赖、基本用法、类型换等。 还要注意用户给出的JSON字符串格式是否正确。原字符串中的义双引号可能需要处理,但在Java中字符串需要义,所以代码示例中应该正确使用。例如,字符串在Java中应该写成"[\"Android\",\"iOS\",\"HarmonyOS\"]",但在代码中可能需要使用反斜杠义,或者用户可能从文件或网络获取该字符串,不需要手动处理义。 另外,用户可能需要了解Fastjson的不同方法,比如使用parseArray和泛型,或者TypeReference来处理类型擦除的问题。需要解释这两种方法的区别和适用场景,以及推荐最佳实践。 还要考虑异常处理,比如JSON解析可能出现的异常,如格式错误时的处理,或者如何避免类型换错误。用户可能需要知道如何捕获这些异常,确保代码的健壮性。 最后,对比之前提到的Jackson和Gson,可能需要简要说明Fastjson的特点,比如性能优势,但也要提到其安全漏洞的历史,提醒用户注意版本选择和安全性问题。用户可能在选择JSON库时需要权衡这些因素。 总结回答的结构:先介绍Fastjson的基本用法,给出换的代码示例,说明两种不同的解析方法,讨论注意事项,比如依赖添加、异常处理和安全性,最后提供完整示例和总结建议。确保每个部分清晰,帮助用户一步步解决问题。</think>以下是用FastjsonJSON字符串换为`List<String>`的完整解决方案: --- ### 一、**基础换方法** #### 1. 添加依赖 ```xml <!-- Maven --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.83</version> <!-- 注意使用安全版本 --> </dependency> ``` #### 2. 基础换代码 ```java import com.alibaba.fastjson.JSON; String jsonStr = "[\"Android\",\"iOS\",\"HarmonyOS\"]"; // 方案1:直接解析为List<String> List<String> list = JSON.parseArray(jsonStr, String.class); // 方案2:使用TypeReference(推荐处理复杂泛型) List<String> list2 = JSON.parseObject(jsonStr, new TypeReference<List<String>>(){}); // 验证输出 System.out.println(list); // [Android, iOS, HarmonyOS] ``` --- ### 二、**技术细节说明** #### 1. **方法对比** | 方法 | 适用场景 | 特点 | |---------------------|-----------------------------|-----------------------------| | `JSON.parseArray()` | 简单类型集合换 | 直接指定元素类型 | | `JSON.parseObject()`| 复杂泛型/嵌套结构 | 通过`TypeReference`解决泛型擦除 | #### 2. **异常处理** ```java try { List<String> list = JSON.parseArray(jsonStr, String.class); } catch (JSONException e) { // 处理格式错误的情况 System.err.println("JSON解析失败: " + e.getMessage()); } ``` --- ### 三、**高级用法** #### 1. 处理非标准格式 ```java // 带多余空格的JSON String messyJson = "[ \" Android \", \" iOS \" , null ]"; List<String> list = JSON.parseArray(messyJson, String.class) .stream() .filter(Objects::nonNull) .map(String::trim) .collect(Collectors.toList()); // 结果:[Android, iOS] ``` #### 2. 嵌套结构处理 ```java String complexJson = "[[\"Java\"],[\"C++\",\"Go\"],[\"Python\"]]"; List<List<String>> nestedList = JSON.parseObject(complexJson, new TypeReference<List<List<String>>>(){}); ``` --- ### 四、**性能优化建议** #### 1. 预编译TypeReference ```java // 高频调用场景优化 private static final Type LIST_STRING_TYPE = new TypeReference<List<String>>(){}.getType(); public List<String> parseFast(String json) { return JSON.parseObject(json, LIST_STRING_TYPE); } ``` #### 2. 禁用特性提升速度 ```java // 关闭ASM特性提升兼容性(仅限1.2.68+版本) static { ParserConfig.getGlobalInstance().setAutoTypeSupport(true); } ``` --- ### 五、**常见问题解决** #### 1. **中文乱码问题** ```java // 指定编码格式 List<String> list = JSON.parseArray(jsonStr.getBytes(StandardCharsets.UTF_8), String.class); ``` #### 2. **特殊符号处理** ```java // 包含义字符的JSON String specialJson = "[ \"带\\\"引号\\\"的内容\" ]"; List<String> list = JSON.parseArray(specialJson, String.class); // 结果:[带"引号"的内容] ``` #### 3. **空集合处理** ```java String emptyJson = "null"; // 或 "[]" List<String> list = JSON.parseArray(emptyJson, String.class); if(list == null) list = Collections.emptyList(); // 防御性处理 ``` --- ### 六、**安全注意事项** 1. **版本选择** 避免使用存在漏洞的版本(建议≥1.2.83) 2. **AutoType防护** ```java // 关闭危险特性 ParserConfig.getGlobalInstance().setAutoTypeSupport(false); ``` --- ### 七、**完整工具类示例** ```java public class JsonUtils { private static final Type LIST_STRING_TYPE = new TypeReference<List<String>>(){}.getType(); public static List<String> safeParse(String json) { try { List<String> result = JSON.parseObject(json, LIST_STRING_TYPE); return (result != null) ? result : Collections.emptyList(); } catch (JSONException e) { System.err.println("JSON解析异常: " + e.getMessage()); return Collections.emptyList(); } } } // 使用示例 List<String> osList = JsonUtils.safeParse("[\"Android\",\"iOS\"]"); ``` --- ### 八、**与其他库对比** | 特性 | Fastjson | Jackson | Gson | |--------------------|----------|---------|--------| | 解析速度 | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ | | 内存占用 | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | | 泛型支持 | 需要`TypeReference` | 需要`TypeReference` | 自动推断 | | 安全记录 | 有漏洞历史 | 良好 | 良好 | --- **最佳实践建议**: - 优先使用`JSON.parseObject()`+`TypeReference`组合 - 生产环境必须设置`setAutoTypeSupport(false)` - 对于$>10MB$的JSON数据,建议使用`JSONReader`流式解析
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值