Json 如何利用Scala的类型系统来维护动态属性集的类型信息

Json 如何利用Scala的类型系统来维护动态属性集的类型信息,json,mongodb,scala,Json,Mongodb,Scala,我遇到了一个用例,需要解析txt文件中的一组信息。有效负载的核心是一组键:值对,我在开发时不知道这些 Wombat Area: "Northern Alberta" Tank Level (ft): -3.395 Temperature (C): 19.3 Batt Voltage: 13.09 Last Maintained: 2012-01-01 Secured: "Yes" 正如您所看到的,字符串、数字、日期和布尔值是有潜力的。还有一个用例,用户需要为某些属性创建规则,例如: 当储罐液位

我遇到了一个用例,需要解析txt文件中的一组信息。有效负载的核心是一组键:值对,我在开发时不知道这些

Wombat
Area: "Northern Alberta"
Tank Level (ft): -3.395
Temperature (C): 19.3
Batt Voltage: 13.09
Last Maintained: 2012-01-01
Secured: "Yes"
正如您所看到的,字符串、数字、日期和布尔值是有潜力的。还有一个用例,用户需要为某些属性创建规则,例如:

当储罐液位超过n时,请通知一些相关人员。user@someplace.com 如果包含阿尔伯塔省的网站不安全,请通知一些人。user@someplace.com

根据属性的类型,可用的规则类型将有所不同。我可能还需要对数值类型进行某种聚合。总之,长话短说,我需要类型信息。那么什么样的数据结构是最好的呢

最初我打算使用不同的元组

val stringAttributes: Array[(String, String)]
val doubleAttributes: Array[(String, Double)]
val dateAttributes: Array[(String, Date)]
现在这似乎是错误的,或者至少是丑陋的。然后我想可能是这样的:

val attributes: Array[(String, Any)]
现在我在很多地方都有一个模式匹配。还要注意,我正在为web应用程序和数据库MongoDB使用JSON协议。给前端这样的东西会很方便:

{
    site: "Wombat",
    attributes: [
        { "Area": "Northern Alberta" },
        { "Tank Level (ft)": -3.395 },
        { "Temperature (C)": 19.3 }
    ]
}

但在后端,我是否对类型进行编码?我需要解析原始JSON吗?最后,我正在寻找维护动态属性集类型信息的最佳方法,同时支持web客户端和数据库的JSON。

+1关于@david的评论

为什么不使用JSON端到端并派生每个规则所需的类型?然后使用单个函数将JSON值转换为正确的类型,在实际不匹配时使用默认值或选项

然后,您可以使用类似的方法在所有已解析的对象上运行规则集:

for (object <- parseObjects(); rule <- rules) {
  val value = coerce(object, rule.desiredType)
  rule(value)
}
或者类似的东西,比如让规则本身调用强制代码。在进行规则处理之前,似乎并不需要对象具有类型,那么为什么要尝试这样做呢

附言。
可能已经能够为您解析文件了,尽管它看起来是一种简单的解析格式。

听起来您希望端到端地使用JSON,那么为什么不使用lift JSON类型(如JObject和JField)在服务器代码中表示数据呢?然后,您的主要任务将是解析传入的文本文件。最终,对于每种类型的内容,您都会比单独的集合做得更好,因为直到运行时您才知道这些类型。有一些很酷的东西,比如shapeless的HList,它可以让你建立和操作异构类型的元素,但由于大多数类型信息在运行时被删除,我认为你不能从中得到太多好处。你需要一个类似于异构映射的东西。这个问题可能与: