Java - '\' 未用于转义字符串中的双引号“

Posted

技术标签:

【中文标题】Java - \'\\\' 未用于转义字符串中的双引号“【英文标题】:Java - '\' not being used to escape double quotes " in stringJava - '\' 未用于转义字符串中的双引号“ 【发布时间】:2018-02-23 06:06:57 【问题描述】:

我在字节缓冲区中有一些 JSON 内容为:\"ID\":101"

此内容是从服务调用返回的。我从字节缓冲区中的那个微服务获得结果。 (这意味着 - 我无法更改内容)

现在,我需要从这个缓冲区中获取 json 对象。我正在使用此代码:

            ByteBuffer payloadByteBuffer = invokeResult.getPayload();
            byte[] payloadByteArray = payloadByteBuffer.array();
            rawJson = new String(payloadByteArray, Charset.forName("UTF-8"));
            System.out.println("Raw JSon result = "+rawJson);

打印出来的字符串是:"\"ID\":101"

请注意,'\' 被打印在字符串中,但它最初用于转义双引号。因此,当我尝试将此字符串转换为 JSON 对象时,出现错误:

“缺失值 1 [字符 2 第 1 行]”

这可能是因为 '\' 没有被用来转义双引号字符(我认为)。

所以,我的问题是,如何修改我的字符串以处理 '\' 字符以达到正确的目的?

我已尝试替换“\”。但它没有用。我不知道为什么。 我也尝试过不同的字符集编码:US-ASCII 和 ASCII 但得到了相同的结果。

【问题讨论】:

So, when I try to convert this string to JSON object ... 请向我们展示您使用带有转义双引号的字符串的代码。 字符串 print as "ID":101 不应该是有效的 JSON 吗? 这不是 JSON @TimBiegeleisen 我正在使用此语句将字符串转换为 JSON:JSONObject json = new JSONObject(rawJson); @Carlos:我希望它打印为 "ID":101 但我不知道为什么要添加“/” 【参考方案1】:

你可以试试json-simple。您可以使用来自here的依赖项

P.S:您的JSON 回复有误。

ByteBuffer payloadByteBuffer = invokeResult.getPayload();
byte[] payloadByteArray = payloadByteBuffer.array();
rawJson = new String(payloadByteArray, Charset.forName("UTF-8"));

JSONParser parser = new JSONParser();
try 
        JSONObject json = (JSONObject) parser.parse(rawJson);
 catch (ParseException e) 
    e.printStackTrace();

它解析JSON,其中包含\

【讨论】:

谢谢,JSONParser 似乎对我有用。关于 JSON 响应,服务将 JSON 对象作为字符串返回。我想我会让它作为 json 对象而不是字符串返回 即使JSONObject 作为String 返回也不应该使JSON 出错。我猜从JSONObjectString 的转换是不正确的。如果您喜欢,请为答案投票。 我同意你的看法。问题出在 JSON 到字符串的转换中。我正在使用 jsonObject.toString() 将 json 转换为字符串 您可以使用Gson库将JSON转换为String【参考方案2】:

使用 apache 的 commons lang 库怎么样?

我认为这是解决问题的简单方法。

这是我给你的完整测试代码。

package just.test;

import java.nio.charset.Charset;

import org.apache.commons.lang3.StringEscapeUtils;
import org.json.JSONObject;

import com.ibm.icu.impl.ByteBuffer;

public class UnescapeCharTest 

    private static void testJSONString(final String rawJson)
    
        JSONObject json = null;

        try
        
            json = new JSONObject(rawJson);
            System.out.println("ID = "+json.get("ID"));
        
        catch(org.json.JSONException je)
        
            je.printStackTrace();
        

        String convJson = rawJson.replace("\\", "");

        try
        
            json = new JSONObject(convJson);
            System.out.println("ID = "+json.get("ID"));
        
        catch(org.json.JSONException je)
        
            je.printStackTrace();
        

        convJson = StringEscapeUtils.unescapeJson(rawJson);

        try
        
            json = new JSONObject(convJson);
            System.out.println("ID = "+json.get("ID"));
        
        catch(org.json.JSONException je)
        
            je.printStackTrace();
        
    

    public static void main(String[] args)
    

        String rawJson = "\\\"ID\\\":101";

        testJSONString(rawJson);

        String rawJson2 = null;


        ByteBuffer payloadByteBuffer = ByteBuffer.wrap(rawJson.getBytes());

        byte[] payloadByteArray = payloadByteBuffer.array();
        rawJson2 = new String(payloadByteArray, Charset.forName("UTF-8"));

        testJSONString(rawJson2);


    

我希望代码适合你。

好好编码……

【讨论】:

感谢您的回复。一旦运行此语句,我的代码就会失败 json = new JSONObject(rawJson); 您的错误信息是什么?你的班级里有合适的罐子吗?

以上是关于Java - '\' 未用于转义字符串中的双引号“的主要内容,如果未能解决你的问题,请参考以下文章

Oracle中的单引号怎么转义

vb去掉字符串中的双引号

用R中的双引号替换转义的双引号

java正则转义json中双引号

vba 如何去掉返回结果两端的双引号?

转储到 JSON 添加额外的双引号和引号转义