Simple JSON string escape for C++?

前端 未结 3 1951
一生所求
一生所求 2020-12-13 02:28

I\'m having a very simple program that outputs simple JSON string that I manually concatenate together and output through the std::cout stream (the output really is that sim

3条回答
  •  伪装坚强ぢ
    2020-12-13 02:41

    I have written a simple JSON escape and unescaped functions. The code is public available in GitHub. For anyone interested here is the code:

    enum State {ESCAPED, UNESCAPED};
    
    std::string escapeJSON(const std::string& input)
    {
        std::string output;
        output.reserve(input.length());
    
        for (std::string::size_type i = 0; i < input.length(); ++i)
        {
            switch (input[i]) {
                case '"':
                    output += "\\\"";
                    break;
                case '/':
                    output += "\\/";
                    break;
                case '\b':
                    output += "\\b";
                    break;
                case '\f':
                    output += "\\f";
                    break;
                case '\n':
                    output += "\\n";
                    break;
                case '\r':
                    output += "\\r";
                    break;
                case '\t':
                    output += "\\t";
                    break;
                case '\\':
                    output += "\\\\";
                    break;
                default:
                    output += input[i];
                    break;
            }
    
        }
    
        return output;
    }
    
    std::string unescapeJSON(const std::string& input)
    {
        State s = UNESCAPED;
        std::string output;
        output.reserve(input.length());
    
        for (std::string::size_type i = 0; i < input.length(); ++i)
        {
            switch(s)
            {
                case ESCAPED:
                    {
                        switch(input[i])
                        {
                            case '"':
                                output += '\"';
                                break;
                            case '/':
                                output += '/';
                                break;
                            case 'b':
                                output += '\b';
                                break;
                            case 'f':
                                output += '\f';
                                break;
                            case 'n':
                                output += '\n';
                                break;
                            case 'r':
                                output += '\r';
                                break;
                            case 't':
                                output += '\t';
                                break;
                            case '\\':
                                output += '\\';
                                break;
                            default:
                                output += input[i];
                                break;
                        }
    
                        s = UNESCAPED;
                        break;
                    }
                case UNESCAPED:
                    {
                        switch(input[i])
                        {
                            case '\\':
                                s = ESCAPED;
                                break;
                            default:
                                output += input[i];
                                break;
                        }
                    }
            }
        }
        return output;
    }
    

提交回复
热议问题