2016-10-05 37 views
0

我有一個JSON對象數組,看起來像這樣結合JSON「行」新的目標與「colums」

[ 
    {"PM":"Jane","e":"[email protected]","h":"15.00","w":"10/30/2016 12:00:00 AM","c":"John","p":"Happy Town USA"}, 
    {"PM":"Jane","e":"[email protected]","h":"11.00","w":"11/06/2016 12:00:00 AM","c":"John","p":"Happy Town USA"}, 
    {"PM":"Jill","e":"[email protected]","h":"21.00","w":"10/30/2016 12:00:00 AM","c":"John","p":"Sad Town USA"}, 
    {"PM":"Jill","e":"[email protected]","h":"12.00","w":"11/06/2016 12:00:00 AM","c":"John","p":"Sad Town USA"} 
] 

望着數據對於給定的PM,E,P均「列」, c組合的數據是相同的,除了w和h字段。我需要將這些數據轉換成一個看起來像這樣的新對象。

[ 
    {PM:"Jane",e:"[email protected]",c:"John",p:"Happy Town USA", 
    Details:[{"w":"10/30/2016","h":"15.00"},{"w":"11/06/2016","h":"11.00"}]}, 
    {PM:"Jill",e:"[email protected]",c:"John",p:"Sad Town USA", 
    Details:[{"w":"10/30/2016","h":"21.00"},{"w":"11/06/2016","h":"12.00"}]} 
] 

這有點像在一個SQL查詢從行做列,遺憾的是我沒有對源數據無法控制,這樣是不是一種選擇。

+0

我可以在2種方式,你可以achive你的目標建議。 One - Programaticaly進行轉換,二:將JSON轉換爲XML並使用XSLT進行轉換並將結果xml轉換爲JSON。第一種方法很簡單,但第二種方法將是robus,因爲您將轉換邏輯外化到XSLT。 API可用於將JSON轉換爲XML和viseversa。 – Manmay

+1

如何做到這一點取決於您使用哪種語言來處理JSON。你不能用JSON本身進行這樣的轉換(因爲它不是一種編程語言) –

+0

我應該提到語言,它是Javascript,這兩個都很有趣。 – user1735894

回答

1

var source = [{ 
 
    "PM": "Jane", 
 
    "e": "[email protected]", 
 
    "h": "15.00", 
 
    "w": "10/30/2016 12:00:00 AM", 
 
    "c": "John", 
 
    "p": "Happy Town USA" 
 
}, { 
 
    "PM": "Jane", 
 
    "e": "[email protected]", 
 
    "h": "11.00", 
 
    "w": "11/06/2016 12:00:00 AM", 
 
    "c": "John", 
 
    "p": "Happy Town USA" 
 
}, { 
 
    "PM": "Jill", 
 
    "e": "[email protected]", 
 
    "h": "21.00", 
 
    "w": "10/30/2016 12:00:00 AM", 
 
    "c": "John", 
 
    "p": "Sad Town USA" 
 
}, { 
 
    "PM": "Jill", 
 
    "e": "[email protected]", 
 
    "h": "12.00", 
 
    "w": "11/06/2016 12:00:00 AM", 
 
    "c": "John", 
 
    "p": "Sad Town USA" 
 
}]; 
 

 
// First we'll transform the source into a dictionary 
 
var dict = source.reduce(function(p, c) { 
 
    // We'll use the combination of PM,e,c and p to build a key 
 
    var key = [c.PM, c.e, c.c, c.p].join("-"); 
 
    if (p[key]) { 
 
    // If we've seen this key before, we'll just add to the Details 
 
    p[key].Details.push({ 
 
     w: c.w, 
 
     h: c.h 
 
    }); 
 
    } else { 
 
    // otherwise we create a new entry and populate it 
 
    p[key] = { 
 
     PM: c.PM, 
 
     c: c.c, 
 
     e: c.e, 
 
     p: c.p, 
 
     Details: [{ 
 
     w: c.w, 
 
     h: c.h 
 
     }] 
 
    } 
 
    } 
 
    return p; 
 
}, {}); 
 

 
// We now have a dictionary 
 
console.log(dict); 
 

 
// If you really need an array (and don't care about order), we can transform 
 
// the dictonary to an array (order is not guaranteed here) 
 
var result = Object.keys(dict).map(function(a) { 
 
    return dict[a]; 
 
}); 
 

 
console.log(result);

+0

非常感謝你,這工作完美,正是我一直在尋找。 – user1735894

2

你想用reduce在JavaScript來實現這些類型的轉換:

var arr = /* your array of objects goes here */; 

var results = Object.values(arr.reduce(function(obj, row) { 
    var pm = row.PM; 

    // here we check to see if we already have an aggregator for that pm 
    if (!obj[pm]) { 
    obj[pm] = { 
     PM: pm, 
     e: row.e, 
     c: row.c, 
     p: row.p 
     Details: [] 
    }; 
    } 

    // now we need to add a record to the Details 
    obj[pm].Details.push({ w: row.w, h: row.h }); 

    // common mistake using reduce is to forget 
    // to return the accumulator 
    return obj; 
}, {})); 

您可以轉換回一個JSON字符串JSON.stringify。請注意,Object.values尚未在每個JavaScript環境中實現,因此您可能需要對其進行填充。

0

的Java方法只:這個問題聽起來一個快速的解決方案非常具有挑戰性的。我來到這裏的部分解決方案使用Java Oson庫我創建,這裏是the source file

@Test 
public void testTableMerge2() { 
    List<Map> list = oson.readValue("rows2Columns.txt"); 

    Map<String, List> collected = new HashMap<>(); 

    for (Map map: list) { 
     String key = (String) map.get("PM"); 
     List obj = collected.get(key); 

     if (obj == null) { 
      obj = new ArrayList(); 

      collected.put(key, obj); 
     } 

     obj.add(map); 
    } 

    Config config = merge.getConfig(); 
    config.numericValue = NUMERIC_VALUE.MERGE_UNIQUE; 
    config.nonnumericalValue = NONNUMERICAL_VALUE.MERGE_UNIQUE; 
    config.listValue = LIST_VALUE.MERGE_UNIQUE; 

    Map<String, Object> results = new HashMap<>(); 

    for (String key: collected.keySet()) { 
     results.put(key, merge.merge(collected.get(key))); 
    } 

    Collection result = results.values(); 

    // oson.pretty(); 
    String json = oson.serialize(result); 

    String expected = "[{\"PM\":\"Jill\",\"e\":\"[email protected]\",\"h\":[\"21.00\",\"12.00\"],\"w\":[\"10/30/2016 12:00:00 AM\",\"11/06/2016 12:00:00 AM\"],\"c\":\"John\",\"p\":\"Sad Town USA\"},{\"PM\":\"Jane\",\"e\":\"[email protected]\",\"h\":[\"15.00\",\"11.00\"],\"w\":[\"10/30/2016 12:00:00 AM\",\"11/06/2016 12:00:00 AM\"],\"c\":\"John\",\"p\":\"Happy Town USA\"}]"; 

    assertEquals(expected, json); 
}