解析复杂的JSON-地图

时间:2019-05-31 05:50:52

标签: json scala json4s

我需要在SCALA中解析复杂的JSON(下),以获取“度量”键中的“表达式”和“值”的值,即我需要列表(COUNT,COUNT_DISTINCT ...)和列表(1,tbl1 .USER_ID ...)。

我尝试了多个选项,但是它不起作用。感谢您的帮助

override func viewDidLoad() {
    super.viewDidLoad()

    lbl_content.attributedText = AgreementContent.CreateAttributedText()  // this will return the content
}

这是我尝试过的代码的一部分,并且给出了一个空列表

{
  "uuid": "uuidddd",
  "last_modified": 1559080222953,
  "version": "2.6.1.0",
  "name": "FULL_DAY_2_mand_date",
  "is_draft": false,
  "model_name": "FULL_DAY_1_may05",
  "description": "",
  "null_string": null,
  "dimensions": [
    {
      "name": "PLATFORM",
      "table": "tbl1",
      "column": "PLATFORM",
      "derived": null
    },
    {
      "name": "OS_VERSION",
      "table": "tbl1",
      "column": "OS_VERSION",
      "derived": null
    }
  ],
  "measures": [
    {
      "name": "_COUNT_",
      "function": {
        "expression": "COUNT",
        "parameter": {
          "type": "constant",
          "value": "1"
        },
        "returntype": "bigint"
      }
    },
    {
      "name": "UU",
      "function": {
        "expression": "COUNT_DISTINCT",
        "parameter": {
          "type": "column",
          "value": "tbl1.USER_ID"
        },
        "returntype": "hllc(12)"
      }
    },
    {
      "name": "CONT_SIZE",
      "function": {
        "expression": "SUM",
        "parameter": {
          "type": "column",
          "value": "tbl1.SIZE"
        },
        "returntype": "bigint"
      }
    },
    {
      "name": "CONT_COUNT",
      "function": {
        "expression": "SUM",
        "parameter": {
          "type": "column",
          "value": "tbl1.COUNT"
        },
        "returntype": "bigint"
      }
    }
  ],
  "dictionaries": [],
  "rowkey": {
    "rowkey_columns": [
      {
        "column": "tbl1.OS_VERSION",
        "encoding": "dict",
        "encoding_version": 1,
        "isShardBy": false
      },
      {
        "column": "tbl1.PLATFORM",
        "encoding": "dict",
        "encoding_version": 1,
        "isShardBy": false
      },
      {
        "column": "tbl1.DEVICE_FAMILY",
        "encoding": "dict",
        "encoding_version": 1,
        "isShardBy": false
      }
    ]
  },
  "hbase_mapping": {
    "column_family": [
      {
        "name": "F1",
        "columns": [
          {
            "qualifier": "M",
            "measure_refs": [
              "_COUNT_",
              "CONT_SIZE",
              "CONT_COUNT"
            ]
          }
        ]
      },
      {
        "name": "F2",
        "columns": [
          {
            "qualifier": "M",
            "measure_refs": [
              "UU"
            ]
          }
        ]
      }
    ]
  },
  "aggregation_groups": [
    {
      "includes": [
        "tbl1.PLATFORM",
        "tbl1.OS_VERSION"
      ],
      "select_rule": {
        "hierarchy_dims": [],
        "mandatory_dims": [
          "tbl1.DATE_HR"
        ],
        "joint_dims": []
      }
    }
  ],
  "signature": "ttrrs==",
  "notify_list": [],
  "status_need_notify": [
    "ERROR",
    "DISCARDED",
    "SUCCEED"
  ],
  "partition_date_start": 0,
  "partition_date_end": 3153600000000,
  "auto_merge_time_ranges": [
    604800000,
    2419200000
  ],
  "volatile_range": 0,
  "retention_range": 0,
  "engine_type": 4,
  "storage_type": 2,
  "override_kylin_properties": {
    "job.queuename": "root.production.P0",
    "is-mandatory-only-valid": "true"
  },
  "cuboid_black_list": [],
  "parent_forward": 3,
  "mandatory_dimension_set_list": [],
  "snapshot_table_desc_list": []
}

3 个答案:

答案 0 :(得分:0)

您的Parameter类与JSON不匹配,因为您使用type1而不是type作为字段名称。使用反引号将“类型”用作字段名称,即使它是保留字也是如此:

case class Parameter (
    `type`: String,
    value: String
  )

您还需要更改Function类,因为它具有returntype1而不是returntype

case class Function (
    expression: String,
    parameter: Parameter,
    returntype: String
  )

Scala中的字段名称必须与JSON中的字段名称完全匹配。 JSON中的多余字段将被忽略,但是Scala中的所有字段必须在JSON中具有匹配的字段。如果JSON中有可选字段,则Scala字段类型应为Option[...]

答案 1 :(得分:0)

ADT中有一些错别字:

这是您需要的:

  case class Function (
                        expression: String,
                        parameter: Parameter,
                        returntype: String
                      )

  case class Parameter (
                         `type`: String,
                         value: String
                       )


  case class Measures (
                        name: String,
                        function: Function
                      )

  case class AllMeasuresData(uuid: String, measures: List[Measures])

json中还有一个逗号,这是正确的:

  {
   "uuid":"uuidddd",
   "last_modified":1559080222953,
   "version":"2.6.1.0",
   "name":"FULL_DAY_2_mand_date",
   "is_draft":false,
   "model_name":"FULL_DAY_1_may05",
   "description":"",
   "null_string":null,
   "dimensions":[
      {
         "name":"PLATFORM",
         "table":"tbl1",
         "column":"PLATFORM",
         "derived":null
      },
      {
         "name":"OS_VERSION",
         "table":"tbl1",
         "column":"OS_VERSION",
         "derived":null
      } // There was an extra trailing comma here
   ],
   "measures":[
      {
         "name":"_COUNT_",
         "function":{
            "expression":"COUNT",
            "parameter":{
               "type":"constant",
               "value":"1"
            },
            "returntype":"bigint"
         }
      },
      {
         "name":"UU",
         "function":{
            "expression":"COUNT_DISTINCT",
            "parameter":{
               "type":"column",
               "value":"tbl1.USER_ID"
            },
            "returntype":"hllc(12)"
         }
      },
      {
         "name":"CONT_SIZE",
         "function":{
            "expression":"SUM",
            "parameter":{
               "type":"column",
               "value":"tbl1.SIZE"
            },
            "returntype":"bigint"
         }
      },
      {
         "name":"CONT_COUNT",
         "function":{
            "expression":"SUM",
            "parameter":{
               "type":"column",
               "value":"tbl1.COUNT"
            },
            "returntype":"bigint"
         }
      }
   ],
   "dictionaries":[

   ],
   "rowkey":{
      "rowkey_columns":[
         {
            "column":"tbl1.OS_VERSION",
            "encoding":"dict",
            "encoding_version":1,
            "isShardBy":false
         },
         {
            "column":"tbl1.PLATFORM",
            "encoding":"dict",
            "encoding_version":1,
            "isShardBy":false
         },
         {
            "column":"tbl1.DEVICE_FAMILY",
            "encoding":"dict",
            "encoding_version":1,
            "isShardBy":false
         }
      ]
   },
   "hbase_mapping":{
      "column_family":[
         {
            "name":"F1",
            "columns":[
               {
                  "qualifier":"M",
                  "measure_refs":[
                     "_COUNT_",
                     "CONT_SIZE",
                     "CONT_COUNT"
                  ]
               }
            ]
         },
         {
            "name":"F2",
            "columns":[
               {
                  "qualifier":"M",
                  "measure_refs":[
                     "UU"
                  ]
               }
            ]
         }
      ]
   },
   "aggregation_groups":[
      {
         "includes":[
            "tbl1.PLATFORM",
            "tbl1.OS_VERSION"
         ],
         "select_rule":{
            "hierarchy_dims":[

            ],
            "mandatory_dims":[
               "tbl1.DATE_HR"
            ],
            "joint_dims":[

            ]
         }
      }
   ],
   "signature":"ttrrs==",
   "notify_list":[

   ],
   "status_need_notify":[
      "ERROR",
      "DISCARDED",
      "SUCCEED"
   ],
   "partition_date_start":0,
   "partition_date_end":3153600000000,
   "auto_merge_time_ranges":[
      604800000,
      2419200000
   ],
   "volatile_range":0,
   "retention_range":0,
   "engine_type":4,
   "storage_type":2,
   "override_kylin_properties":{
      "job.queuename":"root.production.P0",
      "is-mandatory-only-valid":"true"
   },
   "cuboid_black_list":[

   ],
   "parent_forward":3,
   "mandatory_dimension_set_list":[

   ],
   "snapshot_table_desc_list":[

   ]
}

现在您可以运行:

  val data = parse(tmp).extract[AllMeasuresData]
  val names = data.measures.map(_.name)

  println(names)
// Displays
// List(_COUNT_, UU, CONT_SIZE, CONT_COUNT)

答案 2 :(得分:0)

Valy建议的更改有效。谢谢大家