Как правильно использовать сопоставление с образцом для обработки данных JSON? - PullRequest
0 голосов
/ 26 сентября 2018

Я извлекаю данные из разных конечных точек API и затем обрабатываю их, чтобы впоследствии создать DataFrame из JSON.После обработки каждая строка JSON состоит из данных о магазине, его показателях отдела и отдела.В каждом магазине может быть несколько отделов, а в каждом отделе может быть несколько показателей.И в этом случае List[String] возвращается после обработки.

Однако я заметил, что если в магазине нет отделов, весь магазин пропадет.Также как если у отдела нет метрик, у меня нет возвращаемых данных.

Но я хочу, чтобы данные хранилища и отдела возвращались, даже если метрики отдела отсутствуют.Или просто хранить данные, если у них нет отделов.

Вот моя текущая реализация:

def processStoreData(store: JValue): List[String] = {
implicit val formats: DefaultFormats.type = DefaultFormats

val departmentsArray: JArray = parse(departmentsFromAPI).asInstanceOf[JArray]

def getMergeMetrics(department: JValue): List[String] = {
    val metricsArray: JArray = parse(metricsFromAPI).asInstanceOf[JArray]
    mergeStoreDepartmentsMetrics(metricsArray, store, department)
}

// For each Department get its Metrics and merge with the Store data
val mergedData: List[String] = departmentsArray.children.flatMap(deptEntry =>
      getMergeMetrics(deptEntry))

mergedData
}

// Merging each Metric with its Department and a Store the Department belongs to
def mergeStoresDepartmentsMetrics(metricsArray: JArray, store: JValue, department: JValue): List[String] = {
    metricsArray.children
      .map(metric => store merge metric merge department)
      .map(mergedData => compact(render(mergedData)))
  }

Я предполагаю, что логику следует изменить так, чтобы, если departmentsArray был пустым, он возвращал только строковое представление store JValue.И если в магазине есть отдел, в котором отсутствуют метрики, он должен вернуть объединенные магазин и отдел.

Я недавно начал изучать Scala и не уверен, что может быть лучшим способом реализации логики.И нужен совет, что я должен изменить в моей текущей реализации?

Я пытался использовать сопоставление с образцом, но это не сработало.«дети» выделены красным, а всплывающее окно указывает 'Cannot resolve symbol children' и выше deptEntry - 'Missing parameter type:deptEntry'

val mergedData: List[String] = departmentsArray match { 
   case JArray(deptArr) if deptArr.nonEmpty => 
    deptArr.children.flatMap(deptEntry =>
      getMergeMetrics(deptEntry))

   case _ => List(compact(render(store)))
}
...