我的字符串输入类似于:
{"key1":"value1","key2":"{\"key2_1\":\"123\",\"key2_2\":\"456\",\"key2_3\":\"33333\"}"}
上述JSON中的值字段可能包含"
,\
等字符。为了您的方便,这里是格式化的版本:
{
"key1": "value1",
"key2": "{\"key2_1\":\"123\",\"key2_2\":\"456\",\"key2_3\":\"33333\"}"
}
我想使用Gson将String转换为Foo对象:
class Foo {
private String key1;
private Bar key2;
...
}
class Bar {
private String key2_1;
private String key2_2;
private String key2_3;
...
}
这是我的正则表达式:
String regexp = "\\{[\"a-zA-Z-0-9:,\\\\]*\"key2\":\"\\{\\\\\"key2_1\\\\\":\\\\\"[a-zA-Z0-9]*\\\\\",\\\\\"key2_2\\\\\":\\\\\"[a-zA-Z0-9]*\\\\\",\\\\\"key2_3\\\\\":\\\\\"[a-zA-Z0-9]*\\\\\"\\}\"\\}[\"a-zA-Z-0-9:,\\\\]*";
Pattern pattern = Pattern.compile(regexp);
Matcher matcher = pattern.matcher(text);
if(matcher.matches()) {
... // TODO: Replace all "{, \" and }" but How???
}
我如何使用此正则表达式将所有"{
,\"
和"}
替换为{
,"
,{{1不改变JSON中的键和值?
查找子字符串并使用String的replace方法将是我的备份解决方案。
同样,我的最终目标是将输入String解析为我的Foo对象。有没有更好的方法而不是使用正则表达式?
谢谢!
答案 0 :(得分:2)
黄金法则不要为这些事情使用常规表达 :) 我的建议也是JSON映射器,例如Jackson
您需要做的一切:
添加杰克逊依赖
ObjectMapper
创建ObjectMapper mapper = new ObjectMapper();
Foo foo = mapper.readValue( "{\"key1\":\"value1\",\"key2\":"
+ " {\"key2_1\":\"123\",\"key2_2\":\"456\",\"key2_3\":\"33333\"}}", Foo.class);
System.out.println(foo.toString());
并让他处理您的JSON字符串
{{1}}
希望它有所帮助!
答案 1 :(得分:1)
进一步挖掘后,我找到了这两个链接:
Gson custom deseralizer for one variable in an object
Gson custom seralizer for one variable (of many) in an object using TypeAdapter
我通过注册自己的JsonDeserializer
到GsonBuilder
来实现我的目标:
private static GsonBuilder gsonBuilder = new GsonBuilder().registerTypeAdapter(Bar.class, new JsonDeserializer<Bar>() {
@Override
public Bar deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
Bar result = new Bar();
String regexp = "\"\\{\\\\\"key2_1\\\\\":\\\\\"(?s).*\\\\\".\\\\\"key2_2\\\\\":\\\\\"(?s).*\\\\\",\\\\\"key2_3\\\\\":\\\\\"(?s).*\\\\\"\\}\"";
Pattern pattern = Pattern.compile(regexp);
Matcher matcher = pattern.matcher(json.toString());
String modifiedJsonStr = json.toString();
if(matcher.matches()) {
modifiedJsonStr = json.toString().replace("\"{", "{").replace("}\"", "}").replace("\\\"", "\"");
}
result = new Gson().fromJson(modifiedJsonStr, Bar.class);
return result;
}
});
干杯。