2013-05-09 364 views
3

我想使用Java來接收JSON體,遍歷記錄並將每個其他記錄輸出到新的JSON數組中。兩組記錄中的每一組都是它自己的數組,並且我只需要在每個相應的數組中使用第一組記錄。我還將在原始請求中提供需要添加到後續展平對象中的列名稱。舉例來說,假設我有以下JSON請求體:將JSON平鋪爲特定格式

{ 
    "records": [ 
    [ 
     [ 
      "0DFC29E2-700E-4CC1-931E-B61DF4954B6B", 
      "John Doe", 
      "Teacher", 
      "China" 
     ], 
     [ 
      "B5B9186E-CE65-4911-8516-C510D3CC3ACE", 
      "Jane Doe", 
      "Doctor", 
      "London" 
     ] 
    ], 
    [ 
     [ 
      "20C4DD07-4E96-47F8-A1E1-B20B4C48120C", 
      "Jim Doe", 
      "Lawyer", 
      "Canada" 
     ], 
     [ 
      "76718CB1-238F-418E-BD14-5E2867FF3FB4", 
      "Jack Doe", 
      "Chef", 
      "Mexico" 
     ] 
    ] 
    ], 
    "columns": [ 
    "ID", 
    "Name", 
    "Occupation", 
    "Location" 
    ] 
} 

我然後像扁平下面這個請求體:

[{ 
    "ID": "0DFC29E2-700E-4CC1-931E-B61DF4954B6B", 
    "Name": "John Doe", 
    "Occupation": "Teacher", 
    "Location": "China" 
}, 
{ 
    "ID": "20C4DD07-4E96-47F8-A1E1-B20B4C48120C", 
    "Name": "Jim Doe", 
    "Occupation": "Lawyer", 
    "Location": "Canada" 
}] 

我想這個代碼是相當動態,所以它沒有明確引用代碼中的列名。這樣我可以在將來傳遞其他列名稱,如果我有不同的JSON主體結構,它將相應地工作。我會一直以「記錄」標題傳遞數據,因此可以硬編碼。任何幫助是極大的讚賞。

回答

0

您應該將源JSON轉換爲地圖集合。每個地圖將包含屬性名稱和屬性值。之後,您可以輕鬆將其序列化爲預期的格式。在下面的示例中,我使用了Jackson庫,但我認爲您應該也可以使用Gson庫。

首先,我們應該定義SourceEntity類,它定義了輸入JSON的所有屬性。

class SourceEntity { 

    private String[][][] records; 
    private String[] columns; 

    public String[][][] getRecords() { 
     return records; 
    } 

    public void setRecords(String[][][] records) { 
     this.records = records; 
    } 

    public String[] getColumns() { 
     return columns; 
    } 

    public void setColumns(String[] columns) { 
     this.columns = columns; 
    } 
} 

之後,我們應該寫轉換器,它可以分析輸入JSON,轉換數組到地圖的收集和序列化的目標JSON。

class JsonConverter { 

    private ObjectMapper objectMapper = new ObjectMapper(); 
    private JsonFactory jsonFactory = new JsonFactory(); 

    public String convert(File sourceJsonFile) throws Exception { 
     SourceEntity sourceEntity = parseSourceEntity(sourceJsonFile); 
     List<Map<String, String>> result = convertToTargetPropertiesMap(sourceEntity); 

     return objectMapper.writeValueAsString(result); 
    } 

    private SourceEntity parseSourceEntity(File sourceJsonFile) 
      throws Exception { 
     JsonParser parser = jsonFactory.createJsonParser(sourceJsonFile); 
     return objectMapper.readValue(parser, SourceEntity.class); 
    } 

    private List<Map<String, String>> convertToTargetPropertiesMap(
      SourceEntity entity) { 
     List<Map<String, String>> list = new ArrayList<Map<String, String>>(); 
     for (String[][] pairs : entity.getRecords()) { 
      list.add(createPropertyMap(entity.getColumns(), pairs[0])); 
     } 
     return list; 
    } 

    private Map<String, String> createPropertyMap(String[] names, 
      String[] values) { 
     Map<String, String> propertyMap = new LinkedHashMap<String, String>(); 
     for (int i = 0; i < values.length; i++) { 
      propertyMap.put(names[i], values[i]); 
     } 
     return propertyMap; 
    } 
} 

最後,我們應該編寫一個小測試:

import java.io.File; 
import java.util.ArrayList; 
import java.util.LinkedHashMap; 
import java.util.List; 
import java.util.Map; 

import com.fasterxml.jackson.core.JsonFactory; 
import com.fasterxml.jackson.core.JsonParser; 
import com.fasterxml.jackson.databind.ObjectMapper; 

public class JacksonProgram { 

    public static void main(String[] args) throws Exception { 
     JsonConverter converter = new JsonConverter(); 
     String result = converter.convert(new File("/tmp/source.json")); 
     System.out.println(result); 
    } 
} 

上述程序打印此JSON爲您例如輸入:

[{"ID":"0DFC29E2-700E-4CC1-931E-B61DF4954B6B","Name":"John Doe","Occupation":"Teacher","Location":"China"},{"ID":"20C4DD07-4E96-47F8-A1E1-B20B4C48120C","Name":"Jim Doe","Occupation":"Lawyer","Location":"Canada"}] 
0

您可以將源JSON讀入一堆Java對象,在Java端進行轉換,並以新格式輸出。

如果存在與XSLT相當的JSON,那就太好了,但我還沒有看到一個通用的。