Как создать Java-карту строк для сложного объекта, построенного из нескольких строк данных - PullRequest
2 голосов
/ 04 июля 2019

Я запускаю запрос и получаю следующие данные из базы данных.

painter_id  color_id    color   used 
1           100         blue    t
1           101         green   t
1           102         red     f
1           103         black   f
1           104         yellow  f
2           110         violet  t
2           111         cyan    t
2           112         brown   t
2           113         white   f
2           114         orange  f

Мне нужна помощь для построения следующего вывода;

{
    "colors": {
        "1": {
            "used": {
                "results": [
                    "blue",
                    "green"
                ]
            },
            "notUsed": {
                "results": [
                    "red",
                    "black",
                    "yellow"
                ]
            }
        },
        "2": {
            "used": {
                "results": [
                    "violet",
                    "cyan",
                    "brown"
                ]
            },
            "notUsed": {
                "results": [
                    "white",
                    "orange"
                ]
            }
        }
    }
}

Определение чванства для вывода:

ColorResponse:
  type: object
  properties:
    colors:
      type: object
      additionalProperties:
        $ref: "#/definitions/ColorUsages"

ColorUsages:
  type: object
  properties:
    used:
      $ref: "#/definitions/ColorUsage"
    notUsed:
      $ref: "#/definitions/ColorUsage"

ColorUsage:
  type:  object
  properties:
    count:
      type: integer
      format: int32
      description: How many colors are there
    results:
      type: array
      items:
        type: string
        description: The color name     

Где;

Map<String, ColorUsage> colors = new HashMap<String, ColorUsages>();
ColorUsage used;
ColorUsage notUsed;
Integer count;
List<String> results = new ArrayList<>();

Предположим, что результаты вашего запроса доступны с помощью;

data.forEach( row -> row.painter_id(),  row.color_id(), row.color(), row.used())        

Также предположим, что вы можете использовать следующее:

Map<String, ColorUsages> colors = new HashMap<>();

ColorUsage.Builder usedColorUsage = ColorUsage.builder();
ColorUsage.Builder notUsedColorUsage = ColorUsage.builder();

usedColorUsage.addResultsItem(row.color());

ColorUsages.Builder colorUsagesBuilder = ColorUsages.builder();

ColorUsages colorUsages = colorUsagesBuilder
                        .used(usedColorUsage.build())
                        .notUsed(notUsedColorUsage.build())
                        .build();

colors.put(row.painter_id(), colorUsages);

В настоящее время я получаю данные, делаю небольшие обновленияи сохранить его в TreeBasedTable.Затем я перебираю цвета и должен создать объекты usedColorUsage и notUsedColorUsage для художника.Затем мне нужно добавить usedColorUsage и notUsedColorUsage к colorUsages.Наконец, мне нужно добавить сопоставленную комбинацию painter_id и colorUsages к цветам.

1 Ответ

0 голосов
/ 04 июля 2019

Используйте org.json.simple.JSONArray и org.json.simple.JSONObject вместе с картой, чтобы упростить вашу работу.

public JSONObject buildOutPut(List<TableData> dataList) {

        JSONObject finalObject = new JSONObject();

        Map<String, JSONObject> map = new HashMap<String, JSONObject>();

        for(TableData oneRow: dataList) {
            if(map.containsKey(oneRow.getPainterId())) {

                JSONObject subObject =  map.get(oneRow.getPainterId());


                if(oneRow.getUsed().equalIgnoreCase("t")) {
                    JSONObject usedResultsObj  = (JSONObject) subObject.get("used");
                    JSONArray usedResults  = (JSONArray) usedResultsObj.get("results");
                    usedResults.add(oneRow.getColor());

                    usedResultsObj.put("results", usedResults);
                    subObject.put("used", usedResultsObj);
                    map.put(oneRow.getPainterId(), subObject);

                } else if(oneRow.getUsed().equalIgnoreCase("f")) {
                    JSONObject notUsedResultsObj  = (JSONObject) subObject.get("notUsed");
                    JSONArray notUsedResults  = (JSONArray) notUsedResultsObj.get("results");
                    notUsedResults.add(oneRow.getColor());

                    notUsedResultsObj.put("results", notUsedResults);
                    subObject.put("notUsed", notUsedResults);
                    map.put(oneRow.getPainterId(), subObject);

                }


            } else {
                JSONObject subObject = new JSONObject();

                JSONObject usedResultsObj = new JSONObject();
                JSONObject notUsedResultsObj = new JSONObject();

                JSONArray usedResults = new JSONArray();
                JSONArray notUsedResults = new JSONArray();

                if(oneRow.getUsed().equalIgnoreCase("t")) {
                    usedResults.add(oneRow.getColor());
                } else if(oneRow.getUsed().equalIgnoreCase("f")) {
                    notUsedResults.add(oneRow.getColor());
                }

                usedResultsObj.put("results", usedResults);
                notUsedResultsObj.put("results", notUsedResults);
                subObject.put("used", usedResultsObj);
                subObject.put("notUsed", notUsedResultsObj);

                map.put(oneRow.getPainterId(), subObject);
            }
        }

        finalObject.put("colors", map);

        return finalObject;

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...