Merge pull request #604 from square/eric.💲

Fix dollar sign escaping for json key names.
This commit is contained in:
Jesse Wilson
2018-08-05 22:34:21 -04:00
committed by GitHub
3 changed files with 23 additions and 2 deletions

View File

@@ -303,7 +303,7 @@ internal class AdapterGenerator(
result.addStatement("%N.beginObject()", writerParam) result.addStatement("%N.beginObject()", writerParam)
propertyList.forEach { property -> propertyList.forEach { property ->
result.addStatement("%N.name(%S)", writerParam, property.jsonName) result.addStatement("%N.name(\"${property.jsonName}\")", writerParam)
result.addStatement("%N.toJson(%N, %N.%L)", result.addStatement("%N.toJson(%N, %N.%L)",
nameAllocator.get(property.delegateKey), writerParam, valueParam, property.name) nameAllocator.get(property.delegateKey), writerParam, valueParam, property.name)
} }

View File

@@ -128,7 +128,7 @@ internal data class TargetProperty(
private val Element?.jsonName: String? private val Element?.jsonName: String?
get() { get() {
if (this == null) return null if (this == null) return null
return getAnnotation(Json::class.java)?.name return getAnnotation(Json::class.java)?.name?.replace("$", "\\$")
} }
override fun toString() = name override fun toString() = name

View File

@@ -55,6 +55,27 @@ class GeneratedAdaptersTest {
@JsonClass(generateAdapter = true) @JsonClass(generateAdapter = true)
data class JsonAnnotation(@Json(name = "foo") val bar: String) data class JsonAnnotation(@Json(name = "foo") val bar: String)
@Test
fun jsonAnnotationWithDollarSign() {
val adapter = moshi.adapter(JsonAnnotationWithDollarSign::class.java)
// Read
@Language("JSON")
val json = "{\"\$foo\": \"bar\"}"
val instance = adapter.fromJson(json)!!
assertThat(instance.bar).isEqualTo("bar")
// Write
@Language("JSON")
val expectedJson = "{\"\$foo\":\"baz\"}"
assertThat(adapter.toJson(JsonAnnotationWithDollarSign("baz"))).isEqualTo(expectedJson)
}
@JsonClass(generateAdapter = true)
data class JsonAnnotationWithDollarSign(@Json(name = "\$foo") val bar: String)
@Test @Test
fun defaultValues() { fun defaultValues() {
val adapter = moshi.adapter(DefaultValues::class.java) val adapter = moshi.adapter(DefaultValues::class.java)