3 回答

TA貢獻1796條經驗 獲得超4個贊
如果類不大,你可以編寫自定義的 deserialiser,如下所示,您可以在其中控制傳入的元素:XModel
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.google.gson.JsonPrimitive;
import java.io.File;
import java.io.FileReader;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class GsonApp {
public static void main(String[] args) throws Exception {
File jsonFile = new File("./resource/test.json").getAbsoluteFile();
Gson gson = new GsonBuilder()
.registerTypeAdapter(XModel.class, new XModelJsonDeserializer())
.create();
System.out.println(gson.fromJson(new FileReader(jsonFile), XModel.class));
}
}
class XModelJsonDeserializer implements JsonDeserializer<XModel> {
private final Set<String> TRUE_STRINGS = new HashSet<>(Arrays.asList("true", "1", "yes"));
@Override
public XModel deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
XModel response = new XModel();
JsonObject jsonResponse = (JsonObject) json;
response.setName(jsonResponse.get("name").getAsString());
// other fields
JsonElement dataElement = jsonResponse.get("isValid");
if (dataElement.isJsonNull()) {
response.setValid(false);
} else if (dataElement.isJsonPrimitive()) {
JsonPrimitive jsonPrimitive = dataElement.getAsJsonPrimitive();
if (jsonPrimitive.isBoolean()) {
response.setValid(jsonPrimitive.getAsBoolean());
} else if (jsonPrimitive.isNumber()) {
response.setValid(jsonPrimitive.getAsNumber().intValue() == 1);
} else if (jsonPrimitive.isString()) {
response.setValid(TRUE_STRINGS.contains(jsonPrimitive.getAsString()));
}
System.out.println("Json data is primitive: " + dataElement.getAsString());
} else if (dataElement.isJsonObject() || dataElement.isJsonArray()) {
response.setValid(true); //?!?!
}
return response;
}
}
對于以下有效負載:JSON
{
"name" : "john doe",
"isValid" : true
}
以上程序打?。?/p>
Json data is primitive: true
XModel{name='john doe', isValid=true}
對于有效負載:JSON
{
"name" : "john doe",
"isValid" : 1
}
指紋:
Json data is primitive: 1
XModel{name='john doe', isValid=true}
您的模型很清楚,因為所有工作都是在 deserialiser 級別完成的。
一個稍微精確的解決方案是僅序列化。假設該模型如下所示:primitive
class XModel {
private String name;
@JsonAdapter(value = BooleanJsonDeserializer.class)
private boolean isValid;
// getters, setters
}
我們的 deserialiser 如下所示:BooleanJsonDeserializer
class BooleanJsonDeserializer implements JsonDeserializer<Boolean> {
private final Set<String> TRUE_STRINGS = new HashSet<>(Arrays.asList("true", "1", "yes"));
@Override
public Boolean deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
System.out.println(json);
JsonPrimitive jsonPrimitive = json.getAsJsonPrimitive();
if (jsonPrimitive.isBoolean()) {
return jsonPrimitive.getAsBoolean();
} else if (jsonPrimitive.isNumber()) {
return jsonPrimitive.getAsNumber().intValue() == 1;
} else if (jsonPrimitive.isString()) {
return TRUE_STRINGS.contains(jsonPrimitive.getAsString().toLowerCase());
}
return false;
}
}
您只需要在模型中使用此適配器注釋每個屬性,它就可以處理:,,等。boolean1True

TA貢獻1818條經驗 獲得超8個贊
我不相信執行此映射很容易,但以下內容可能會有所幫助。
public void setIsValid(Object isValid) {
String isValidString = String.valueOf(isValid).replace("0", "false").replace("1", "true");
return Boolean.valueOf(isValidString);
}

TA貢獻1789條經驗 獲得超8個贊
你可以從Apache Commons Lang看一看。有一種方法可以將不同類型的字符串(和其他對象)解析為布爾值。BooleanUtilities
System.out.println(BooleanUtils.toBoolean(1));
System.out.println(BooleanUtils.toBoolean(true));
System.out.println(BooleanUtils.toBoolean("TrUe"));
System.out.println(BooleanUtils.toBoolean("true"));
輸出
true
true
true
true
但是,您可以像這樣組合它:BooleanUtils.toBoolean("1");false
String isValid = jsonPrimitive.get("isValid").getAsString();
System.out.println(BooleanUtils.toBoolean(isValid) || isValid.equals("1"));
添加回答
舉報