Как правильно достать массив из JSON? библиотека org.json
public String[] ReadFullArray(Context Context, String Key, int TargetArraySize) throws IOException, JSONException {
String[] Array = new String[TargetArraySize];
Array = new String[3];
JSONObject JSONObj = new JSONObject(GetJsonFileContent(Context));
JSONArray JsonArray = JSONObj.getJSONArray(Key);
for (int i = 0; i <= JsonArray.length(); i++) {
Array[i] = JsonArray.getString(i);
}
return Array;
}
private String GetJsonFileContent(Context Context) throws IOException {
File Cfg = new File("/data/data/mate.files/", "Cfg.json");
String PreparedData = "";
int CfgLength = CfgStr.getBytes().length;
char[] Char;
Char = new char[CfgLength];
InputStreamReader InputRdr = new InputStreamReader(Context.openFileInput("Cfg.json"));
InputRdr.read(Char, 0, CfgLength);
int Counter = 0;
//Convert char array to String
for (Counter = 0; Counter != CfgLength; Counter++) {
StringBuilder StrBld = new StringBuilder();
PreparedData = PreparedData + Char[Counter];
}
InputRdr.close();
return PreparedData;
}
Почему-то метод ReadFullArray возвращает массив, равный null.
JSON:
{
"OnStartOpen": "PrevSession",
"ExitBehavior": "NoReqNoDeletion",
"ExitRequestTimeout": "No",
"DefaultAction": "Exit",
"Locale": "",
"Accounts": "No",
"ListViewMode": "DetailedList",
"ListSort": "AZ",
"ShowGraphAboveList": false,
"UITheme": "Space",
"TabCloseBtn": "Left",
"TabIcon": false,
"NewTabPos": "AfterCurrent",
"ClonedTabPos": "AfterCurrent",
"MinActiveTabWidth": "65px",
"MinTabWidth": "45px",
"MaxActiveTabWidth": "MaxPossible",
"MaxTabWidth": "MaxPossible",
"TabShape": "Rounded",
"TabMark": "Line",
"TabMarkColor": "DefinedByTheme",
"TabMarkWeight": "8px",
"ShowTabCloseBtnOn": "AllTabs",
"NewTabBtnPos": "Right",
"EnableExperimentalTabFeatures": false,
"EnableTabGrouping": true,
"TabGroupType": "Compact",
"GroupTabsByDrag": "false",
"OpenTabGroupAppearance": "Dropdn",
"Layout1SelectionBottom": "NormBarPinned",
"Layout1SelectionBottomContent": ["Selection'@string/Selection'", "Delete'@string/Delete'", "Copy'@string/Copy'", "Compress'@string/Compress'", "Extract'@string/Extract'", "Folder'Menu'"],
"Layout1SelectionBottomAppearance": ["60", "Fit", "Center", "Rounded", "Icon", "Expandable"],
"Layout1Bottom": "NormBarPinned",
"Layout1BottomContent": ["Selection'@string/Selection'", "Folder'@string/New'", "*NewDir'@string/NewDir'", "*NewFile'@string/NewFile'", "Folder'Open'", "*OpenAssoc'@string/OpenAssoc'", "*OpenWith'@string/OpenWith'", "*OpenAs'@string/OpenAs'", "Delete'@string/Delete'", "Copy'@string/Copy'", "Compress'@string/Compress'", "Extract'@string/Extract'", "Folder'Menu'"],
"Layout1BottomAppearance": ["60", "Fit", "Center", "Rounded", "Icon", "Expandable"],
"Layout1Top": "NormBarPinned",
"Layout1TopContent": ["Tabs", "NewTab"],
"Layout1TopAppearance": ["60", "Fit", "Center", "Rounded"],
"OperReq": "Checkbox",
"ContextMenuLvl1": ["Folder'@string/New'", "*NewDir'@string/NewDir'", "*NewFile'@string/NewFile'", "Folder'Open'", "*OpenAssoc'@string/OpenAssoc'", "*OpenWith'@string/OpenWith'", "*OpenAs'@string/OpenAs'", "Div", "Copy'@string/Copy'", "Cut'@string/Cut'", "Paste'@string/Paste'", "Div", "Delete'@string/Delete'", "Compress'@string/Compress'", "Extract'@string/Extract'", "Div", "CopyPath'@string/CopyPath'", "Div", "Props'@string/Properties'"],
}
Ответы (1 шт):
Автор решения: Дмитрий
→ Ссылка
Все, что вы написали, вполне ужасно. 90% всех действий и объявленных переменных абсолютно бессмысленны. Правила именования, о которых говорится на первой странице любого учебника, не соблюдаются. И так далее по списку... Если я все правильно понял (я имею в виду смысл написанного), то пробуйте примерно так:
public String[] readFullArray(String cfgFileName, String key) throws IOException, JSONException {
return StreamSupport.stream(new JSONObject(getJsonFileContent(cfgFileName))
.getJSONArray(key).spliterator(), false)
.toArray(String[]::new);
}
private String getJsonFileContent(String cfgFileName) throws IOException {
return Files.lines(Paths.get(cfgFileName)).collect(Collectors.joining(System.lineSeparator()));
}
Для чтения из файла есть много способов, в т.ч., к примеру, использовать сканер:
private String getJsonFileContent(String cfgFileName) throws IOException {
try (Scanner scanner = new Scanner(new File(cfgFileName))) {
StringBuilder fileContents = new StringBuilder();
while (scanner.hasNextLine()) fileContents.append(scanner.nextLine()).append(System.lineSeparator());
return fileContents.toString();
}
}
Стримы можно легко заменить на цикл, тогда соответствующий метод выглядит так:
public String[] readFullArray(String cfgFileName, String key) throws IOException, JSONException {
List<Object> list = new JSONObject(getJsonFileContent(cfgFileName)).getJSONArray(key).toList();
String [] result = new String[list.size()];
for (int i = 0; i < list.size(); i++) result[i] = String.valueOf(list.get(i));
return result;
}