gson 在java中将嵌套Json文件转换为CSV

dsf9zpds  于 2022-11-06  发布在  Java
关注(0)|答案(4)|浏览(258)
  1. {
  2. "Employee": [
  3. {
  4. "empMID": "mock:1",
  5. "comments": [],
  6. "col1": "something",
  7. "contact": [{"address":"2400 waterview", "freetext":true}
  8. ],
  9. "gender": "male"
  10. },
  11. {
  12. "empMID": "mock:2",
  13. "comments": [],
  14. "col1": "something",
  15. "contact": [{"address":"2200 waterview", "freetext":true}
  16. ],
  17. "gender": "female"
  18. }
  19. ],
  20. "cola": false,
  21. "colb": false
  22. }

这是我的Json文件看起来。我需要转换这个json到一个csv。(我试图转换多维数据到二维)。我使用gson为我的目的。我不能使用gson。fromgson()函数来对象Map与模板,因为它应该是通用的。
我知道我们可以使用CDL将jsonarray转换为csv格式,但它在我的情况下不起作用。
我的csv格式看起来像

  1. Employee*
  2. empMID,comment.$,contact.address,contact.freetext,gender
  3. mock:1,,2400 waterview,TRUE,male
  4. mock:123,,2200 waterview,TRUE,female
  5. colA#
  6. TRUE
  7. colB#
  8. FALSE

我试着用google-GSON api来转换成这种格式。但是我不能转换成这种格式。我用 * 来表示它的json数组,用#来表示它的原始类型,用contact.address来表示另一个json数组中的嵌套数组。我在关联这个嵌套结构时遇到了问题。我可以像列一样递归地遍历所有的东西。提前感谢

  1. public static void main(String[] args) throws IOException{
  2. BufferedReader reader=null;
  3. StringBuilder content=null;
  4. String result=null;
  5. reader = new BufferedReader(new FileReader("temp.json"));
  6. String line = null;
  7. content= new StringBuilder();
  8. while ((line = reader.readLine()) != null) {
  9. content.append(line);
  10. }
  11. reader.close();
  12. result= content.toString();
  13. JsonElement jelement = new JsonParser().parse(result);
  14. printJsonRecursive(jelement);
  15. }
  16. public static void printJsonRecursive(JsonElement jelement){
  17. if(jelement.isJsonPrimitive()){
  18. System.out.println(jelement.getAsString());
  19. return;
  20. }
  21. if(jelement.isJsonArray()){
  22. JsonArray jarray= jelement.getAsJsonArray();
  23. for(int i=0;i<jarray.size();i++){
  24. JsonElement element= jarray.get(i);
  25. printJsonRecursive(element);
  26. }
  27. return;
  28. }
  29. JsonObject jobject= jelement.getAsJsonObject();
  30. Set<Entry<String, JsonElement>> set= jobject.entrySet();
  31. for (Entry<String, JsonElement> s : set) {
  32. printJsonRecursive(s.getValue());
  33. }
  34. }
  35. }
ycl3bljg

ycl3bljg1#

如果您有一个Map到json的对象,则可以通过反射来实现这一点。
1.使用gson/Jackson实现json到java对象转换
1.通过迭代类使用反射追加字段并获取您感兴趣的任何字段。
1.通过从目标对象获取值来附加反射值。
更多细节请看下面我的博文:
vcfvct.wordpress.com/2015/06/30/converting-nested-json-files-to-csv-in-java-with-reflection/

qaxu7uf2

qaxu7uf22#

您没有打印key。这样应该可以修复它。

  1. for (Entry<String, JsonElement> s : set) {
  2. System.out.println(s.getKey()); //Added
  3. printJsonRecursive(s.getValue());
  4. }

您可以在这里处理\n

编辑

如果你想只打印一次重复的json对象的键,创建一个Java bean来保存数据和递归过程中的populate it。一旦bean完成,在那里添加一个方法,以你想要的格式打印所有数据(只打印一次键,依此类推)。

z0qdvdin

z0qdvdin3#

您可以使用json2flat库将JSON转换为CSV
这个库不需要任何POJO的。它只是将JSON作为字符串,并以**List<Object[]>的格式返回JSON的2D表示
例如,对于JSON:

  1. {
  2. "Employee": [
  3. {
  4. "empMID": "mock:1",
  5. "comments": [],
  6. "col1": "something",
  7. "contact": [{"address":"2400 waterview", "freetext":true}
  8. ],
  9. "gender": "male"
  10. },
  11. {
  12. "empMID": "mock:2",
  13. "comments": [],
  14. "col1": "something",
  15. "contact": [{"address":"2200 waterview", "freetext":true}
  16. ],
  17. "gender": "female"
  18. }
  19. ],
  20. "cola": false,
  21. "colb": false
  22. }

它给出输出:

  1. /cola,/colb,/Employee/empMID,/Employee/col1,/Employee/gender,/Employee/contact/address,/Employee/contact/freetext
  2. ,,"mock:1","something",,"2400 waterview",true
  3. ,,"mock:2","something",,"2200 waterview",true
  4. false,false,,,,,
展开查看全部
uwopmtnx

uwopmtnx4#

  1. /**
  2. * Get separated comlumns used a separator (comma, semi column, tab).
  3. *
  4. * @param headers The CSV headers
  5. * @param map Map of key-value pairs contains the header and the value
  6. *
  7. * @return a string composed of columns separated by a specific separator.
  8. */
  9. private static String getSeperatedColumns(Set<String> headers, Map<String, String> map, String separator) {
  10. List<String> items = new ArrayList<String>();
  11. for (String header : headers) {
  12. String value = map.get(header) == null ? "" : map.get(header).replaceAll("[\\,\\;\\r\\n\\t\\s]+", " ");
  13. items.add(value);
  14. }
  15. return StringUtils.join(items.toArray(), separator);
  16. }

相关问题