Преобразовать поток данных в Json в java - PullRequest
0 голосов
/ 01 мая 2020

У меня есть файл с данными, как показано ниже, в основном это количество сотрудников отдела. В отделе a есть 2 подотдела b и c с сотрудниками 10 и 30 соответственно. В отделе D работает только один отдел с 50 сотрудниками. Но в отделе d более 90 (50 + 40 других, которые не входят в подраздел e, но в отдел d)

[a , b] = 10
[a , c] = 30
[d , e] = 50
[d] = 40

Мне нужно преобразовать приведенное выше в приведенное ниже Json (формат) для компонент пользовательского интерфейса. Какова лучшая логика c для этого с использованием objectMapper или что-то в Java.

{
 "deptname"="CompName",
 "count" = 130,
 "depts" = [
           {
              "deptname"="a",
              "count" = 40,
              "depts" = [
                         {
                            "deptname"="b",
                             "count" = 10
                         },
                         {
                             "deptname"="c",
                             "count" = 30
                         }
                        ]
           },
           {
               "deptname"="d",
                "count" = 90,
                "depts" = [
                            {
                              "deptname"="e",
                              "count" = 50
                            }
                          ]
            }
          ]
}

Ответы [ 2 ]

0 голосов
/ 02 мая 2020

У меня была похожая ситуация, но в моем случае название отдела повторилось.

[a , b] = 10
[a , c] = 30
[a , c] = 20
[d , e] = 50
[d] = 40
[d] = 40

Мне нужно добавить [a, c] = 30 и [a, c] = 20, чтобы сделать его 50 , (вместо 30). [d] должно быть 130, Как я могу изменить его, как показано ниже?

`"depts" = [
       {
          "deptname"="a",
          "count" = 40,
          "depts" = [
                     {
                        "deptname"="b",
                         "count" = 10
                     },
                     {
                         "deptname"="c",
                         "count" = 50
                     }
                     ]
        },
       {
           "deptname"="d",
            "count" = 130,
            "depts" = [
                        {
                          "deptname"="e",
                          "count" = 80
                        }
                      ]
        }
      ]

} `

0 голосов
/ 01 мая 2020

Ваша модель данных для сериализации JSON может выглядеть следующим образом:

import java.util.List;

import com.fasterxml.jackson.annotation.JsonInclude;

public class Dept {
    private String deptname;
    private int count = 0;

    @JsonInclude(JsonInclude.Include.NON_NULL)
    private List<Dept> depts = null;

    public String getDeptname() {
        return deptname;
    }
    public void setDeptname(String deptname) {
        this.deptname = deptname;
    }
    public int getCount() {
        return count + countSubdeps();
    }
    public void setCount(int count) {
        this.count = count;
    }
    public List<Dept> getDepts() {
        return depts;
    }
    public void setDepts(List<Dept> depts) {
        this.depts = depts;
    }

    public void addSubDept(Dept dept) {
        if (this.depts == null) {
            this.depts = new ArrayList<>();
        }
        this.depts.add(dept);
    }

    private int countSubdeps() {
        if (null == depts || depts.isEmpty())
            return 0;
        return depts.stream().mapToInt(d -> d.getCount()).sum();
    }
}

, и вы можете сериализовать ее в JSON с помощью ObjectMapper.

Обновление Пример реализации парсера (без рекурсии):

public static void main(String[] args) {
    Dept root = new Dept();
    root.setDeptname("CompName");

    String src = "[a , b] = 10\n" + 
        "[a , c] = 30\n" + 
        "[d , e] = 50\n" + 
        "[d] = 40";
    List<String> lines = Arrays.asList(src.split("\n"));
    root.setDepts(parseDepts(lines));

    ObjectMapper mapper = new ObjectMapper();
    System.out.println(mapper
        .writerWithDefaultPrettyPrinter().writeValueAsString(root));
}

private static String reg = "^\\[\\s*(\\w+)\\s*(,\\s*(\\w+)\\s*)?\\]\\s*=\\s*(\\d+)\\s*$";
private static Pattern p = Pattern.compile(reg);

private static List<Dept> parseDepts(List<String> lines) {
    if (null == lines || lines.isEmpty())
        return null;
    Map<String, Dept> map = new HashMap<>();

    for (String entry : lines) {
        Matcher match = p.matcher(entry);
        if (match.matches()) {
            String dep = match.group(1);
            String subdep = match.group(3);
            int count = Integer.parseInt(match.group(4));

            Dept dept = map.getOrDefault(dep, new Dept());
            dept.setDeptname(dep);
            if (subdep != null) {
                Dept sub = new Dept();
                sub.setDeptname(subdep);
                sub.setCount(count);
                dept.addSubDept(sub);
            } else {
                dept.setCount(count);
            }
            map.put(dep, dept);
        }
    }
    return map.values().stream().collect(Collectors.toList());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...