Простой способ отобразить csv-таблицу в json с другими именами свойств, чем csv-заголовки с gson? - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть несколько csv-файлов, которые я хочу преобразовать в json.К сожалению, структура CSV не соответствует желаемому формату JSON.а) потому что CSV является плоской структурой и JSON должен иметь вложенную структуру.b) поскольку заголовки столбцов не соответствуют именам свойств json.

Иллюстрирующий минимальный пример CSV:

ColumnNameX,ColumnNameY,ColumnNameZ
valueX,valueY,valueZ

следует преобразовать в этот JSON:

{
  "XZObject": {
    "absurdlyNotNamedLikeCsvHeading": "valueX",
    "AlsoNOTColumnNameZ": "valueZ" },
  "YyyyyWhy": {
     "ThisResemblesColumnNameY": "valueY"
}

Я наивно пошел бы и сделал несколько представляющих POJO-классов и вставил бы значения по позиции - вот так (псевдокод):

class Container {Fields:XZObject,YyyyyWhy}
class XZObject {Fields:absurdlyNotNamedLikeCsvHeading,AlsoNOTColumnNameZ}
class YyyyyWhy {Fields:ThisResemblesColumnNameY}

new XZObject(absurdlyNotNamedLikeCsvHeading=csvLineElements[0],AlsoNOTColumnNameZ=csvLineElements[2])
new YyyyyWhy(ThisResemblesColumnNameY=csvLineElement[1])
new Container(XZObject,YyyyyWhy)

… тогда япреобразует объект Container в JSON с помощью gson.

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

Так что мне интересно: есть ли простой способ сопоставить столбцы CSV по заголовку с определенным свойством JSON?Желательно с помощью gson-lib.

Другими словами: можно ли, например, отобразить значение в столбце с заголовком "ColumnNameZ" на свойство "XZobject.AlsoNOTColumnNameZ" простым способом?

1 Ответ

0 голосов
/ 06 февраля 2019

Я думаю, что анализ CSV-файла в Objects - это хороший способ.

Вы можете сначала прочитать первый столбец, разделить его и вычислить индекс каждого столбца во время выполнения.Тогда не имеет значения, если вы добавляете / удаляете или перемешиваете столбцы

Предполагается, что вы прочитали первую строку и у вас есть

String firstRow = "ColumnNameX,ColumnNameY,ColumnNameZ";

Синтаксически проанализируйте это следующим образом:

List<String> columnList = Arrays.asList(firstRow.split(","));
int COLUMN_NAME_X_INDEX = columnList.indexOf("ColumnNameX");
int COLUMN_NAME_Y_INDEX = columnList.indexOf("ColumnNameY");
int COLUMN_NAME_Z_INDEX = columnList.indexOf("ColumnNameZ");

Чем использовать ваши недавно найденные индексы:

XZObject xzObject = new XZObject(csvLineElements[COLUMN_NAME_X_INDEX], csvLineElements[COLUMN_NAME_Z_INDEX]);
YyyyyWhy yyyyyWhy = new YyyyyWhy(csvLineElements[COLUMN_NAME_Y_INDEX]);
Container container = new Container(XZObject,YyyyyWhy);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...