[英]read dynamic json files in java and merge them
我正在努力與java中的json解析。
是否有可能在java中生成隨機的,非標准化的json文件的表示? 我試圖使用gson,但我真的不明白是否以及如何可能。
所以jsonFile看起來像這樣:
{
"id":16875,
"position":[1,2,5,7],
"metadata":{
"color":"blue",
"id": "84779jh",
"more":{ "some":"randomdata","absolutly":"noStructure"}
}
任何鍵值對都是可能的,json文件可以嵌入盡可能多的深度。 我需要得到類似java對象的東西才能將它與另一個json文件合並。 我只需要元數據部分,其余部分可以忽略。
所以任何人都有任何想法,我怎么能做到這一點? 我會很感激任何幫助:)
上面的json合並(這是父節點,所以我們保留他的id和位置,只是合並元數據)
{
"id":16zut,
"position":[1,2,5,7],
"metadata":{
"color":"green",
"id": "84ergfujh",
"more":{
"some":"randomdata",
"even":"more",
"absolutly":"noStructure"
},
"tags":[1,2,3,4,6,8,f7,h,j,f]
}
將會:
{
"id":16zut,
"position":[1,2,5,7],
"metadata":{
"color":["blue", "green"],
"id": ["84779jh","84ergfujh]",
"more":{ "some":"randomdata","absolutly":"noStructure","even":"more"}
"tags":[1,2,3,4,6,8,f7,h,j,f]
}
在此先感謝您,祝您度過愉快的一天。
在看到你發布的json后我認為你正在嘗試合並兩個具有相同id但不同元數據id的json。 由於json工作的關鍵值。 您不能為同一個鍵設置兩個值,例如此值
"color":"blue", "green",
"id": "84779jh","84ergfujh"
除非你把顏色作為一個數組。 在看到你的json后,你可以根據元數據id創建地圖,你可以將這些元數據地圖添加到單個元數據地圖中
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;
import com.google.common.collect.ImmutableMap;
public class JsonFileMapExample {
public static void main(String[] args) {
try {
ObjectMapper mapper = new ObjectMapper();
// read JSON from a file
Map<String, Object> map_json1 = mapper.readValue(new File(
"F:/Work/DB/work/workspace/restclient/src/json1.json"),
new TypeReference<Map<String, Object>>() {
});
Map<String, Object> map_json2 = mapper.readValue(new File("F:/Work/DB/work/workspace/restclient/src/json2.json"),new TypeReference<Map<String, Object>>() { });
System.out.println(map_json1);
System.out.println(map_json2);
Map<String, Object> map2 = (Map<String, Object>) map_json1.get("metadata");
Map<String, Object> map_json3 = new HashMap<String, Object>();
map_json3 = mergeMyTwoMaps((Map<String, Object>) map_json1.get("metadata"),(Map<String, Object>) map_json2.get("metadata"));
System.out.println(map_json3);
} catch (Exception e) {
e.printStackTrace();
}
}
static Map<String, Object> mergeMyTwoMaps(Map<String, Object> map1, Map<String, Object> map2) {
return ImmutableMap.<String, Object>builder()
.putAll(map1)
.putAll(map2)
.build();
}
}
輸出:
json1= {id=16875, position=[1, 2, 5, 7], metadata={id=84779jh, color=blue, more={some=randomdata, absolutly=noStructure}}}
json2={id=16875, position=[1, 2, 5, 7], metadata={id=84779jhdf, color=green, more={some=dsfasdf, absolutly=afdsadsf}}}
json3_aftermerged={id=16875, position=[1, 2, 5, 7], metadata={id=84779jh, color=blue, more={some=randomdata, absolutly=noStructure}},{id=16875, position=[1, 2, 5, 7], metadata={id=84779jhdf, color=green, more={some=dsfasdf, absolutly=afdsadsf}}}
使用此注意事項您需要http://code.google.com/p/guava-libraries/上的 jar文件
我的問題解決了,我很感激你們幫助我。 所以讓我分享一下:
我讀了2個jsons作為一棵樹(我正在使用傑克遜):
ObjectMapper mapper = new ObjectMapper();
JsonNode parent = mapper.readTree(new File(path));
JsonNode child= mapper.readTree(new File(path));
合並邏輯還沒有完成,但基本概念是:
Iterator<String> pIt = parent.fieldNames();
while(pIt.hasNext())
{
String tempkey = pIt.next();
if(child.path(tempkey) != null)
{
merged.put(tempkey,child.path(tempkey));
}
else{
merged.put(tempkey,parent.path(tempkey) );
}
}
try {
String jsonString = mapper.writeValueAsString(merged);
System.out.println(jsonString);
} catch (JsonProcessingException e) {...}
如果你認為這是一個愚蠢的解決方案,我願意接受其他想法......
但我認為它可能適合我的需求。
問候和謝謝:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.