Допустим, мое приложение должно создать текстовый файл JSON в этой форме
{
"key1"
:
"value1"
,
"key2"
:
"value2"
,
"arrayKey"
:
[
{
"keyA"
:
"valueA"
,
"keyB"
:
"valueB"
,
"keyC"
:
[
0
,
1
,
2
]
}
]
}
из
JSONObject.toString()
, который представляет собой одну длинную строку текста в моем приложении Java для Android
{"key1":"value1","key2":"value2","arrayKey":[{"keyA":"valueA","keyB":"valueB","keyC":[0,1,2]}]}
Было доказано, что подход регулярных выражений не работает.
Есть много подводных камней.
Поэтому я решил создать свой собственный парсер, чтобы выполнить работу
Редактировать: Внимание! В следующем коде есть ошибка, из-за которой экранированные кавычки рассматриваются как нормальные , см. Мой самый ответ на этот вопрос (также с дальнейшим улучшением)
public static String JSONTextToCRSeparatedJSONText(String JSONText)
{
String result="";
String symbolList="{}[]:,";
char ch;
char previousChar=0;
int charNum=JSONText.length();
boolean inRegion=false;
boolean insertedBefore=false;
char startRegionChar=0;
for (int i=0;i<charNum;i++)
{
ch=JSONText.charAt(i);
previousChar=ch; // mistake here, should be after the conditional statements, please see my answer with new code version
if (!inRegion)
{
if (((ch=='\"')||(ch=='\''))&&(previousChar!='\\'))
{
inRegion=true;
startRegionChar=ch;
}
} else
{
if ((ch==startRegionChar)&&(previousChar!='\\'))
{
inRegion=false;
}
}
if ((!inRegion)&& (symbolList.indexOf(ch)>-1)&&(!insertedBefore))
{
result=result+"\n";
}
result=result+ch;
insertedBefore=false;
if ((!inRegion)&& (symbolList.indexOf(ch)>-1))
{
result=result+"\n";
insertedBefore=true; //it will be useful next iteration
}
}
return result;
}
Кажется, он работает.
Просто хотелось бы узнать
, все ли символы, которые он проверяет для вставки управляющего символа \ n, являются ли все символы возможными в тексте JSON
и существуют ли подводные камничто я не могу видеть.