Невозможно декодировать специальный символ при использовании `IOUtils.toString (containerRequestContext.getEntityStream ()," UTF-8 ");` - PullRequest
1 голос
/ 08 ноября 2019

Я использую IOUtils.toString (containerRequestContext.getEntityStream (), "UTF-8");чтобы получить поток сущностей и использовать IOUtils для передачи его в строку. Однако при встрече с каким-либо специальным символом, таким как "{", "[" и т. Д., IOUtils не может их декодировать, могут быть декодированы только английский язык и цифры, а также "&".

Содержимое объекта, декодируемого IOUtlsвыглядит следующим образом

S=9&X=5&R=5&command=%5B%7B++++++++++%22zoneCode%22%3A+%22R98542%22%2C+++++++++++%22targetPosX%22%3A+4122.54%2C+++++++++++%22targetPosY%22%3A+9547.76%2C+++++++++++%22targetPosZ%22%3A+12548.69%2C+++++++++++%22power%22%3A+521456%2C+++++++++++%22duration%22%3A+6412+++++++%7D%2C+++++++%7B+++++++++++%22zoneCode%22%3A+%22R652485%22%2C+++++++++++%22targetPosX%22%3A+95482.36%2C+++++++++++%22targetPosY%22%3A+7845.85%2C+++++++++++%22targetPosZ%22%3A+9847.37%2C+++++++++++%22power%22%3A+741785%2C+++++++++++%22duration%22%3A+6482+++++++%7D%2C++++++%7B+++++++++++%22zoneCode%22%3A+%22R742545%22%2C+++++++++++%22targetPosX%22%3A+16982.93%2C+++++++++++%22targetPosY%22%3A+85623.17%2C+++++++++++%22targetPosZ%22%3A+4872.27%2C+++++++++++%22power%22%3A+34528%2C+++++++++++%22duration%22%3A+342+++++++%7D++%5D+

Данные примитивной формы следующие: | поле | значение || - | - || S | 9 || X | 5 || R | 5 || команда | (текст массива json) |

Значение «команда» показано ниже:

[
{          
"zoneCode": "R98542",           
"targetPosX": 4122.54,           
"targetPosY": 9547.76,           
"targetPosZ": 12548.69,           
"power": 521456,           
"duration": 6412       
},       
{          
"zoneCode": "R652485",          
"targetPosX": 95482.36,           
"targetPosY": 7845.85,           
"targetPosZ": 9847.37,           
"power": 741785,           
"duration": 6482       
},      
{           
"zoneCode": "R742545",           
"targetPosX": 16982.93,           
"targetPosY": 85623.17,           
"targetPosZ": 4872.27,           
"power": 34528,           
"duration": 342       
}  
] 

1 Ответ

0 голосов
/ 08 ноября 2019

Вы также должны сделать декодирование URL. Импортируйте пакет java.net.URLDecoder и используйте метод URLDecoder.decode(string, encoding).

См. Пример ниже (переменная byteToString - текст вашего вопроса):

public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException {
        String byteToString = "S=9&X=5&R=5&command=%5B%7B++++++++++%22zoneCode%22%3A+%22R98542%22%2C+++++++++++%22targetPosX%22%3A+4122.54%2C+++++++++++%22targetPosY%22%3A+9547.76%2C+++++++++++%22targetPosZ%22%3A+12548.69%2C+++++++++++%22power%22%3A+521456%2C+++++++++++%22duration%22%3A+6412+++++++%7D%2C+++++++%7B+++++++++++%22zoneCode%22%3A+%22R652485%22%2C+++++++++++%22targetPosX%22%3A+95482.36%2C+++++++++++%22targetPosY%22%3A+7845.85%2C+++++++++++%22targetPosZ%22%3A+9847.37%2C+++++++++++%22power%22%3A+741785%2C+++++++++++%22duration%22%3A+6482+++++++%7D%2C++++++%7B+++++++++++%22zoneCode%22%3A+%22R742545%22%2C+++++++++++%22targetPosX%22%3A+16982.93%2C+++++++++++%22targetPosY%22%3A+85623.17%2C+++++++++++%22targetPosZ%22%3A+4872.27%2C+++++++++++%22power%22%3A+34528%2C+++++++++++%22duration%22%3A+342+++++++%7D++%5D+";
        String urlDecoded = URLDecoder.decode(byteToString , StandardCharsets.UTF_8.toString());
        System.out.println(urlDecoded);
    }

Результат:

S=9&X=5&R=5&command=[{          "zoneCode": "R98542",           "targetPosX": 4122.54,           "targetPosY": 9547.76,           "targetPosZ": 12548.69,           "power": 521456,           "duration": 6412       },       {           "zoneCode": "R652485",           "targetPosX": 95482.36,           "targetPosY": 7845.85,           "targetPosZ": 9847.37,           "power": 741785,           "duration": 6482       },      {           "zoneCode": "R742545",           "targetPosX": 16982.93,           "targetPosY": 85623.17,           "targetPosZ": 4872.27,           "power": 34528,           "duration": 342       }  ] 
...