使用Groovy把json字符串转成Java代码
最近项目里面的通信接口都是json,所以安卓客户端这边需要写很多的Java bean,很多的时候,Java bean都是可以自动生成的,但是有的不能满足自己的需要,所以我就用Groovy来实现了。
至于为什么用Groovy,因为Groovy是基于JVM的脚本语言,和Java很像,最重要的时,它能兼容Java代码。
比如下的Json
{
"cityId": 18,
"cityName": "西安",
"provinceId": 27,
"cityOrder": 1
}
我们在写Java Bean的时候如下
public class CityInfo{
@SerializedName("cityId")
public String cityId; // 18,
@SerializedName("cityName")
public String cityName; // 西安,
@SerializedName("provinceId")
public String provinceId; // 27,
@SerializedName("cityOrder")
public String cityOrder; // 1
// setter / getter
}
下面是Groovy的简单实现,还是只是简单的生成一些代码,后面考虑实现复制点的。
def jsonSb = new StringBuffer()
new File("json.txt").eachLine {
jsonSb.append(it.trim() + "\n")
}
def jsonStr = jsonSb.replaceAll("\"", "").replaceAll("“", "").replaceAll("”", "").replaceAll(":", "; // ")
def targetSb = new StringBuffer()
jsonStr.split("\n").each { line ->
if (line == null || line.trim().length() == 0) {
return
}
strArray = line.split(";")
if (strArray == null || strArray.length < 2) {
targetSb.append(line + "\n")
return
}
def (first, last) = strArray
if (((String) first).contains("_")) {
String firstStr = first;
def rename = new StringBuffer();
boolean isLastUnline = false;
for (int i = 0; i < firstStr.length(); i++) {
char c = firstStr.charAt(i)
if (c == '_') {
isLastUnline = true
continue
}
if (isLastUnline) {
rename.append(c.toUpperCase())
isLastUnline = false
} else {
rename.append(c)
}
}
targetSb.append("\n\t@SerializedName(\"$first\")\n")
targetSb.append("\tpublic String $rename;$last\n")
} else {
targetSb.append("\n\t@SerializedName(\"$first\")\n")
targetSb.append("\tpublic String $line\n")
}
}
println()
println targetSb
运行结果如下
@SerializedName("cityId")
public String cityId; // 18,
@SerializedName("cityName")
public String cityName; // 西安,
@SerializedName("provinceId")
public String provinceId; // 27,
@SerializedName("cityOrder")
public String cityOrder; // 1