我有一个类似于以下内容的JSON文档:
{
"aaa": [
{
"value": "wewfewfew"
}
],
"bbb": [
{
"value": "wefwefw"
}
]
}
我需要将其反序列化为更干净的内容,例如:
public class MyEntity{
private String aaa;
private String bbb;
}
解包每个数组并在反序列化时提取“值”字段的最佳方法是什么?只定制定制者?或者有更好的方式吗?
答案 0 :(得分:1)
使用Gson的快速解决方案是使用JsonDeserializer
,如下所示:
package stackoverflow.questions.q17853533;
import java.lang.reflect.Type;
import com.google.gson.*;
public class MyEntityDeserializer implements JsonDeserializer<MyEntity> {
public MyEntity deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
String aaa = json.getAsJsonObject().getAsJsonArray("aaa").get(0)
.getAsJsonObject().get("value").getAsString();
String bbb = json.getAsJsonObject().getAsJsonArray("bbb").get(0)
.getAsJsonObject().get("value").getAsString();
return new MyEntity(aaa, bbb);
}
}
然后在解析时使用它:
package stackoverflow.questions.q17853533;
import com.google.gson.*;
public class Q17853533 {
public static void main(String[] arg) {
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(MyEntity.class, new MyEntityDeserializer());
String testString = "{ \"aaa\": [{\"value\": \"wewfewfew\" } ], \"bbb\": [ {\"value\": \"wefwefw\" } ] }";
Gson gson = builder.create();
MyEntity entity= gson.fromJson(testString, MyEntity.class);
System.out.println(entity);
}
}
答案 1 :(得分:1)
为完整起见,如果您使用jackson,则可以启用反序列化功能UNWRAP_SINGLE_VALUE_ARRAYS
。
要做到这一点,你必须为ObjectMapper
启用它,如:
ObjectMapper objMapper = new ObjectMapper()
.enable(DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS);
有了这个,你就可以像杰克逊一样习惯这个班级。
例如,假设班级Person
:
public class Person {
private String name;
// assume getter, setter et al.
}
和json personJson
:
{
"name" : [
"John Doe"
]
}
我们可以通过以下方式对其进行反序列化:
ObjectMapper objMapper = new ObjectMapper()
.enable(DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS);
Person p = objMapper.readValue(personJson, Person.class);