2016-09-15 2 views
0

У меня есть name.json файл, имеющий:Как добавить массив в json-файл, который уже имеет массив?

[ 
{"name" : "James", 
"Surname" : "Bond" 
}, 
{ 
"name" : "Abc", 
"Surname" : "Xyz" 
}] 

Теперь я хочу добавить еще один массив в этот существующий файл:

[ 
    {"name" : "Brad", 
    "Surname" : "Pitt" 
    }, 
    { 
    "name" : "Angelina ", 
    "Surname" : "Jolie " 
    } 
] 

Результат должен выглядеть примерно так:

[ 
    {"name" : "James", 
    "Surname" : "Bond" 
    }, 
    { 
    "name" : "Abc", 
    "Surname" : "Xyz" 
    }, 
     {"name" : "Brad", 
     "Surname" : "Pitt" 
     }, 
     { 
     "name" : "Angelina ", 
     "Surname" : "Jolie " 
     } 
    ] 

Но у меня есть результат:

[ 
{"name" : "James", 
"Surname" : "Bond" 
}, 
{ 
"name" : "Abc", 
"Surname" : "Xyz" 
}]  
    [ 
    {"name" : "Brad", 
    "Surname" : "Pitt" 
    }, 
    { 
    "name" : "Angelina ", 
    "Surname" : "Jolie " 
    } 
] 

Как решить эту проблему?

Я добавляю данные в файл следующим образом.

void writeJson(JSONArray jsonDataObject){ 
    ObjectMapper mapper = new ObjectMapper(); 
    ObjectWriter writer = mapper.writer(new DefaultPrettyPrinter()); 
    writer.writeValue(new File("/home/cp/name.json"), jsonDataObject); 
} 
+1

Post код здесь – Vel

+0

Ну, не вставляйте скобки в тексте редактор. Или вы случайно использовали IDE и что-то программировали? Потому что мы не знаем. –

+0

Thing is, я хочу добавить JSONArry каждый раз, чтобы файл на диске, и я использую eclipse. – Bond

ответ

0

Используя свою любимую библиотеку JSON (я буду использовать json.org для этого примера):

JSONArray fullJsonArray = new JSONArray(); 

JSONArray list1 = JSONArray.fromObject(jsonString1); 
JSONArray list2 = JSONArray.fromObject(jsonString2); 

jsonArray.addAll(list1.toCollection()); 
jsonArray.addAll(list2.toCollection()); 
1

Один разумного пути здесь:

  1. Используйте любого из много парсеров JSON вокруг до читать файл JSON
  2. Это приведет к i п-память представление этого массива
  3. Добавьте дополнительные элементы в массив
  4. использовать другую библиотеку записи весь контент в новый файл

EDIT; с учетом вашего огромного объема:

Ну, тогда я бы посмотрел на распространение всей обработки.

И за что я хотел бы также рассмотреть ваши общие требования:

А) почему ваши данные показывают, как это? Если вы знаете, что вещи должны идти в один JSON массив; не можете ли вы изменить свою «обработку ввода», чтобы сразу создать эту вещь?

B) Или наоборот: не можете ли вы изменить свой процесс «прослеживания», чтобы понять, что данные не поступают в одном, а в нескольких файлах массива JSON?

Другими словами: ваше требование кажется «все записи должны быть в пределах одного массива JSON (файла)». Не можете ли вы изменить это: «записи поступают в массив JSON (файл) s, и есть список , который отслеживает все эти файлы массивов и их порядок ?!

+0

Я пишу JSONArray 5000 раз, имея 1000 объектов в каждом JSONArray. Конечный размер файла составляет около 10 ГБ (10 млн записей). – Bond

+0

Я вижу. Я добавил обновление к своему ответу; надеюсь, это поможет. – GhostCat

0

После того, как вы используете Джексон, рассмотрим следующее решение:

// First JSON 
String json1 = "[{\"name\":\"James\",\"Surname\":\"Bond\"}," 
      + "{\"name\":\"Abc\",\"Surname\":\"Xyz\"}]"; 

// Second JSON 
String json2 = "[{\"name\":\"Brad\",\"Surname\":\"Pitt\"}," 
      + "{\"name\":\"Angelina \",\"Surname\":\"Jolie\"}]"; 

// Create ObjectMapper instance to manipulate JSON 
ObjectMapper mapper = new ObjectMapper(); 

// Parse the JSON strings into the Jackson tree model 
JsonNode tree1 = mapper.readTree(json1); 
JsonNode tree2 = mapper.readTree(json2); 

// Append the second tree to the first tree 
((ArrayNode) tree1).addAll((ArrayNode) tree2); 

// Serialize the tree into a string 
String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(tree1); 

Это произведет следующий результат:

[ { 
    "name" : "James", 
    "Surname" : "Bond" 
}, { 
    "name" : "Abc", 
    "Surname" : "Xyz" 
}, { 
    "name" : "Brad", 
    "Surname" : "Pitt" 
}, { 
    "name" : "Angelina ", 
    "Surname" : "Jolie" 
} ]