#java #arrays #json #collections
#java #массивы #json #Коллекции
Вопрос:
У меня есть JSON, который выглядит следующим образом,
{
"users": [
{
"displayName": "Sharad Dutta",
"givenName": "",
"surname": "",
"extension_user_type": "user",
"identities": [
{
"signInType": "emailAddress",
"issuerAssignedId": "kkr007@gmail.com"
}
],
"extension_timezone": "VET",
"extension_locale": "en-GB",
"extension_tenant": "EG12345"
},
{
"displayName": "Sharad Dutta",
"givenName": "",
"surname": "",
"extension_user_type": "user",
"identities": [
{
"signInType": "emailAddress",
"issuerAssignedId": "kkr007@gmail.com"
}
],
"extension_timezone": "VET",
"extension_locale": "en-GB",
"extension_tenant": "EG12345"
}
]
}
У меня есть приведенный выше код, и он может сгладить JSON следующим образом,
{
"extension_timezone": "VET",
"extension_tenant": "EG12345",
"extension_locale": "en-GB",
"signInType": "userName",
"displayName": "Wayne Rooney",
"surname": "Rooney",
"givenName": "Wayne",
"issuerAssignedId": "pdhongade007",
"extension_user_type": "user"
}
Но код возвращает только последнего пользователя в массиве JSON «users». Он не возвращает первого пользователя (по сути, только последнего пользователя, независимо от того, сколько пользователей там), только последний выходит в сплющенной форме из массива «users».
public class TestConvertor {
static String userJsonAsString;
public static void main(String[] args) throws JSONException {
String userJsonFile = "C:\Users\Administrator\Desktop\jsonRes\json_format_user_data_input_file.json";
try {
userJsonAsString = readFileAsAString(userJsonFile);
} catch (Exception e1) {
e1.printStackTrace();
}
JSONObject object = new JSONObject(userJsonAsString); // this is your input
Map<String, Object> flatKeyValue = new HashMap<String, Object>();
System.out.println("flatKeyValue : " flatKeyValue);
readValues(object, flatKeyValue);
System.out.println(new JSONObject(flatKeyValue)); // this is flat
}
static void readValues(JSONObject object, Map<String, Object> json) throws JSONException {
for (Iterator it = object.keys(); it.hasNext(); ) {
String key = (String) it.next();
Object next = object.get(key);
readValue(json, key, next);
}
}
static void readValue(Map<String, Object> json, String key, Object next) throws JSONException {
if (next instanceof JSONArray) {
JSONArray array = (JSONArray) next;
for (int i = 0; i < array.length(); i) {
readValue(json, key, array.opt(i));
}
} else if (next instanceof JSONObject) {
readValues((JSONObject) next, json);
} else {
json.put(key, next);
}
}
private static String readFileAsAString(String inputJsonFile) throws Exception {
return new String(Files.readAllBytes(Paths.get(inputJsonFile)));
}
}
Пожалуйста, подскажите, где я делаю неправильно или мой код нуждается в модификации.
Комментарии:
1. У вас неверный JSON. Используйте это, чтобы проверить его и обновить свой вопрос допустимым JSON jsonformatter.curiousconcept.com /#
2. Почему этот JSON неверен? Можете ли вы мне объяснить? Потому что это многомерный JSON, заключенный в массив «users».
3. вы проверили ссылку, которую я добавил в комментарии?. В нем указано, что в JSON отсутствует закрывающая скобка для объекта и закрывающая скобка для массива. Кроме этого, почему вы храните пользователей таким образом? вы можете создать массив с именем users и хранить в нем несколько объектов пользователей.
4. Извините, я не понял, что пропустил JSON, да, вы правы, JSON неверен, я обновлю в ответ.
5. Я исправил ошибку JSON с моей стороны.
Ответ №1:
Пожалуйста, попробуйте следующий подход, это даст вам формат, разделенный запятыми, как для пользователя, так и для идентификатора (плоский файл как таковой),
public static void main(String[] args) throws JSONException, ParseException {
String userJsonFile = "path to your JSON";
final StringBuilder sBuild = new StringBuilder();
final StringBuilder sBuild2 = new StringBuilder();
try {
String userJsonAsString = convert your JSON to string and store in var;
} catch (Exception e1) {
e1.printStackTrace();
}
JSONParser jsonParser = new JSONParser();
JSONObject output = (JSONObject) jsonParser.parse(userJsonAsString);
try {
JSONArray docs = (JSONArray) output.get("users");
Iterator<Object> iterator = docs.iterator();
while (iterator.hasNext()) {
JSONObject userEleObj = (JSONObject)iterator.next();
JSONArray nestedIdArray = (JSONArray) userEleObj.get("identities");
Iterator<Object> nestIter = nestedIdArray.iterator();
while (nestIter.hasNext()) {
JSONObject identityEleObj = (JSONObject)nestIter.next();
identityEleObj.keySet().stream().forEach(key -> sBuild2.append(identityEleObj.get(key) ","));
userEleObj.keySet().stream().forEach(key -> {
if (StringUtils.equals((CharSequence) key, "identities")) {
sBuild.append(sBuild2.toString());
sBuild2.replace(0, sBuild2.length(), "");
} else {
sBuild.append(userEleObj.get(key) ",");
}
});
}
sBuild.replace(sBuild.lastIndexOf(","), sBuild.length(), "n");
}
System.out.println(sBuild);
} catch (Exception e) {
e.printStackTrace();
}
}