diff options
author | Mathias <mathias@spray.io> | 2014-10-28 13:23:35 +0100 |
---|---|---|
committer | Mathias <mathias@spray.io> | 2014-10-28 13:23:35 +0100 |
commit | ef6d8a21849a97cdfc63c5cb740dd55f24807a48 (patch) | |
tree | f5a6970b0643d9fe2846b444c96d194476969654 /src/main/scala/spray | |
parent | c3bd8fe437f422e1314a1a2ecd45c1d8f16facaa (diff) | |
download | spray-json-ef6d8a21849a97cdfc63c5cb740dd55f24807a48.tar.gz spray-json-ef6d8a21849a97cdfc63c5cb740dd55f24807a48.tar.bz2 spray-json-ef6d8a21849a97cdfc63c5cb740dd55f24807a48.zip |
Add member name unmangling to ProductFormats, fixes #120
Diffstat (limited to 'src/main/scala/spray')
-rw-r--r-- | src/main/scala/spray/json/ProductFormats.scala | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/src/main/scala/spray/json/ProductFormats.scala b/src/main/scala/spray/json/ProductFormats.scala index 5f5a9f4..39d5300 100644 --- a/src/main/scala/spray/json/ProductFormats.scala +++ b/src/main/scala/spray/json/ProductFormats.scala @@ -78,12 +78,37 @@ trait ProductFormats extends ProductFormatsInstances { sys.error("Case class " + clazz.getName + " declares additional fields") if (fields.zip(copyDefaultMethods).exists { case (f, m) => f.getType != m.getReturnType }) sys.error("Cannot determine field order of case class " + clazz.getName) - fields.map(_.getName) + fields.map(f => ProductFormats.unmangle(f.getName)) } catch { case NonFatal(ex) => throw new RuntimeException("Cannot automatically determine case class field names and order " + "for '" + clazz.getName + "', please use the 'jsonFormat' overload with explicit field name specification", ex) } } + +} + +object ProductFormats { + private val operators = Map( + "$eq" -> "=", + "$greater" -> ">", + "$less" -> "<", + "$plus" -> "+", + "$minus" -> "-", + "$times" -> "*", + "$div" -> "/", + "$bang" -> "!", + "$at" -> "@", + "$hash" -> "#", + "$percent" -> "%", + "$up" -> "^", + "$amp" -> "&", + "$tilde" -> "~", + "$qmark" -> "?", + "$bar" -> "|") + + private def unmangle(name: String) = operators.foldLeft(name) { case (n, (mangled, unmangled)) => + if (n.indexOf(mangled) >= 0) n.replace(mangled, unmangled) else n + } } /** |