如何从JSON字符串双引号“”

问题描述 投票:1回答:2

我得到下面的“数据”字段双引号这样的JSON响应 -

{
"bID" : 1000013253,
"bTypeID" : 1,
"name" : "Test1"
"data" : "{"bc": {    "b": {        "t": 1,        "r": 1,        "c": "none"    },    "i": "CM19014269"}}"
}

虽然这验证JSON,我得到验证错误如下

Error: Parse error on line 18:
...   "document" : "[{"bc": {    "b": {    
-----------------------^
Expecting 'EOF', '}', ':', ',', ']'

我要显示JSON响应为 -

{
"bID" : 1000013253,
"bTypeID" : 1,
"name" : "Test1"
"data" : {"bc": {    "b": {        "t": 1,        "r": 1,        "c": "none"    },    "i": "CM19014269"}}
}

用我的服务器端代码 -

  {
    for (ManageBasketTO manageBasketTO : retList) {
        Long basketId = manageBasketTO.getBasketID();
        BasketTO basketTo = null;
        basketTo = CommonUtil.getBasket(usrCtxtObj, basketId, language, EBookConstants.FOR_VIEWER_INTERFACE,
                usrCtxtObj.getScenarioID(), EBookConstants.YES, request, deviceType);
        String doc = Utilities.getStringFromDocument(basketTo.getdocument());

        doc = doc.replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>", "");
        doc = doc.replace("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>", "");
        doc = doc.trim();
        JSONObject object = XML.toJSONObject(doc);
        doc = object.toString(4);
        BasketsInfoTO basketsInfoTO = new BasketsInfoTO(bId, manageBasketTO.getBTypeID(), manageBasketTO.getName(), doc);
        basketsToc.add(basketsInfoTO);
        }
    basketInfoRestTO.setBasketsInfoTOList(basketsToc);
    ObjectMapper mapper = new ObjectMapper();
    responseXML = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(basketInfoRestTO);
    responseXML = responseXML.replace("\\\"", "\"");
    responseXML = responseXML.replace("\\n", "");
}

任何帮助深表感谢。谢谢

java json web-services double-quotes
2个回答
0
投票

您可以替换双引号为:

String x="\"abcd";
String z=x.replace("\"", "");
System.out.println(z);

0
投票

解析和更换XML / JSON字符串值里的任何东西是不是一个很好的解决方案。你可能会确定以上问题解决与引号,但你的代码会少可读,而且容易出错 - 一些新的错误情况可能发生在未来,但你的代码将无法在处理它们,而无需再次重构以前编写的代码(O SOLID失败)。我已经写了轻微的示例代码,这可能会有帮助。试着在你的代码就像你可以(单一职责)分别承担的责任。 org.JSON库(你在你的代码中使用)处理所有的XML标准,使有效的XML将被转换为JSONObject的,没有任何问题:

P.S对于双引号的情况下,很可能你的XML输入无效,或者您的Utilities.getStringFromDocument方法破坏XML规范的规则。正如我在代码转换XML字符串显示 - 文档的正面和背面不打破XML / JSON标准的任何规格;如果输入XML字符串包含双引号,然后转换JSON人会做的一样好。如果输入XML有双引号,你想转换过程中删除它们,那么你可能首先只能通过从文本创建的JSONObject / JSONArray实例分别转换整个文件,然后重新结构数据。

public static void main(String[] args) {
        StringBuilder xmlText = new StringBuilder("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")
                .append("<sample>")
                .append("<rec1>John</rec1>")
                .append("<rec2>Snow</rec2>")
                .append("<data>")
                .append("<a>Season 1</a>")
                .append("<b>Episode 1</b>")
                .append("</data>")
                .append("</sample>");

        // below two lines of code were added in order to show no quote issue might occur in Document conversion case - like question has
        Document doc = convertStringToDocument(xmlText.toString());
        System.out.println("XML string: " + convertDocumentToString(doc));

        JSONObject xmlJSONObj = XML.toJSONObject(xmlText.toString());
        System.out.println("JSON string: " + xmlJSONObj.toString());
    }

    private static Document convertStringToDocument(String input) {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

        try {
            DocumentBuilder builder = factory.newDocumentBuilder();
            return builder.parse(new InputSource(new StringReader(input)));
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    private static String convertDocumentToString(Document document) {
        TransformerFactory tf = TransformerFactory.newInstance();

        try {
            Transformer transformer = tf.newTransformer();
            // transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); // remove XML declaration
            StringWriter writer = new StringWriter();
            transformer.transform(new DOMSource(document), new StreamResult(writer));
            return writer.getBuffer().toString();
        } catch (TransformerException e) {
            e.printStackTrace();
        }

        return null;
    }
© www.soinside.com 2019 - 2024. All rights reserved.