Skip to content

Commit

Permalink
Don't mangle property names that contain a dollar sign
Browse files Browse the repository at this point in the history
Without this fix the new test fails like this:

    value of: toJson(...)
    expected: {"$a":"apple","$b":"banana"}
    but was : {"${'$'}a":"apple","$b":"banana"}
  • Loading branch information
swankjesse committed Dec 6, 2021
1 parent 3cbd5c3 commit d3baa94
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 12 deletions.
Expand Up @@ -396,8 +396,7 @@ private fun declaredProperties(
propertySpec = property,
parameter = parameter,
visibility = property.modifiers.visibility(),
jsonName = parameter?.jsonName ?: property.annotations.jsonName()
?: name.escapeDollarSigns(),
jsonName = parameter?.jsonName ?: property.annotations.jsonName() ?: name,
jsonIgnore = isIgnored
)
}
Expand Down Expand Up @@ -523,10 +522,6 @@ private fun <T> AnnotationSpec.elementValue(name: String): T? {
}?.value?.value as? T
}

private fun String.escapeDollarSigns(): String {
return replace("\$", "\${\'\$\'}")
}

internal val TypeElement.metadata: Metadata
get() {
return getAnnotation(Metadata::class.java)
Expand Down
Expand Up @@ -243,8 +243,7 @@ private fun declaredProperties(
propertySpec = propertySpec,
parameter = parameter,
visibility = property.getVisibility().toKModifier() ?: KModifier.PUBLIC,
jsonName = parameter?.jsonName ?: property.jsonName()
?: name.escapeDollarSigns(),
jsonName = parameter?.jsonName ?: property.jsonName() ?: name,
jsonIgnore = isTransient || parameter?.jsonIgnore == true || property.jsonIgnore()
)
}
Expand Down Expand Up @@ -279,7 +278,3 @@ private fun KSPropertyDeclaration.toPropertySpec(
}
.build()
}

private fun String.escapeDollarSigns(): String {
return replace("\$", "\${\'\$\'}")
}
Expand Up @@ -743,6 +743,22 @@ class DualKotlinTest {
this.b = b
}
}

@Test fun propertyNameHasDollarSign() {
val moshi = Moshi.Builder().add(KotlinJsonAdapterFactory()).build()
val jsonAdapter = moshi.adapter<PropertyWithDollarSign>()

val value = PropertyWithDollarSign("apple", "banana")
val json = """{"${'$'}a":"apple","${'$'}b":"banana"}"""
assertThat(jsonAdapter.toJson(value)).isEqualTo(json)
assertThat(jsonAdapter.fromJson(json)).isEqualTo(value)
}

@JsonClass(generateAdapter = true)
data class PropertyWithDollarSign(
val `$a`: String,
@Json(name = "\$b") val b: String
)
}

typealias TypeAlias = Int
Expand Down

0 comments on commit d3baa94

Please sign in to comment.