[英]Gson.fromJson(json, Custom.class) empty string
i'm developing a small web application. 我正在开发一个小型Web应用程序。
That's my problem: 那是我的问题:
This is executed when a user try to add a new record in my Datatable 当用户尝试在我的数据表中添加新记录时执行此操作
@RequestMapping(value="/saveJokerRule", method= RequestMethod.POST, consumes= "application/json", produces = "application/json")
@ResponseBody
public String saveJokerRule(@RequestBody String json) {
System.out.println("JSON EDITOR:" + json.toString());
EditorResponse editorResponse = new EditorResponse();
JokerRuleForm jokerRuleForm = new GsonBuilder().serializeNulls().create().fromJson(json, JokerRuleForm.class);
...
}
This is the valid json received by the server and printed by a System call: 这是服务器接收并通过系统调用打印的有效json:
{"action":"create","data":{"0":{"jokerRule":{"group":1,"campaignPhase":"","dailyLimit":"","weeklyLimit":"","monthlyLimit":"","validFrom":"","activity":1}}}}
That's the JokerRuleForm classs 那是JokerRuleForm类
public class JokerRuleForm {
@Expose
String action;
@Expose
@SerializedName("data")
Map<String, JokerRuleView> data;
...
}
That's the JokerRuleView class 那是JokerRuleView类
public class JokerRuleView {
String idJokerRule;
private AgentGroup group;
private JokerRule jokerRule;
private Activity activity;
public class JokerRule{
private String campaignPhase;
private Integer dailyLimit;
private Integer weeklyLimit;
private Integer monthlyLimit;
private Date validFrom;
private Date dateUpdate;
private String group;
private String activity;
/**
* @return the campaignPhase
*/
public String getCampaignPhase() {
return campaignPhase;
}
/**
* @param campaignPhase the campaignPhase to set
*/
public void setCampaignPhase(String campaignPhase) {
this.campaignPhase = campaignPhase;
}
/**
* @return the dailyLimit
*/
public Integer getDailyLimit() {
return dailyLimit;
}
/**
* @param dailyLimit the dailyLimit to set
*/
public void setDailyLimit(Integer dailyLimit) {
this.dailyLimit = dailyLimit;
}
/**
* @return the weeklyLimit
*/
public Integer getWeeklyLimit() {
return weeklyLimit;
}
/**
* @param weeklyLimit the weeklyLimit to set
*/
public void setWeeklyLimit(Integer weeklyLimit) {
this.weeklyLimit = weeklyLimit;
}
/**
* @return the monthlyLimit
*/
public Integer getMonthlyLimit() {
return monthlyLimit;
}
/**
* @param monthlyLimit the monthlyLimit to set
*/
public void setMonthlyLimit(Integer monthlyLimit) {
this.monthlyLimit = monthlyLimit;
}
/**
* @return the validFrom
*/
public Date getValidFrom() {
return validFrom;
}
/**
* @param validFrom the validFrom to set
*/
public void setValidFrom(Date validFrom) {
this.validFrom = validFrom;
}
/**
* @return the dateUpdate
*/
public Date getDateUpdate() {
return dateUpdate;
}
/**
* @param dateUpdate the dateUpdate to set
*/
public void setDateUpdate(Date dateUpdate) {
this.dateUpdate = dateUpdate;
}
/**
* @return the group
*/
public String getGroup() {
return group;
}
/**
* @param group the group to set
*/
public void setGroup(String group) {
this.group = group;
}
/**
* @return the activity
*/
public String getActivity() {
return activity;
}
/**
* @param activity the activity to set
*/
public void setActivity(String activity) {
this.activity = activity;
}
}
public class Activity {
String idActivity;
String name;
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the idGroup
*/
public String getIdActivity() {
return idActivity;
}
/**
* @param idGroup the idGroup to set
*/
public void setIdActivity(String idActivity) {
this.idActivity = idActivity;
}
}
public class AgentGroup {
String idGroup;
String name;
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the idGroup
*/
public String getIdGroup() {
return idGroup;
}
/**
* @param idGroup the idGroup to set
*/
public void setIdGroup(String idGroup) {
this.idGroup = idGroup;
}
}
/**
* @return the idJokerRule
*/
public String getIdJokerRule() {
return idJokerRule;
}
/**
* @param idJokerRule the idJokerRule to set
*/
public void setIdJokerRule(String idJokerRule) {
this.idJokerRule = idJokerRule;
}
/**
* @return the agentGroup
*/
public AgentGroup getGroup() {
return group;
}
/**
* @param agentGroup the agentGroup to set
*/
public void setGroup(AgentGroup group) {
this.group = group;
}
/**
* @return the jokerRule
*/
public JokerRule getJokerRule() {
return jokerRule;
}
/**
* @param jokerRule the jokerRule to set
*/
public void setJokerRule(JokerRule jokerRule) {
this.jokerRule = jokerRule;
}
/**
* @return the activity
*/
public Activity getActivity() {
return activity;
}
/**
* @param activity the activity to set
*/
public void setActivity(Activity activity) {
this.activity = activity;
}
} }
JokerRuleForm jokerRuleForm = new GsonBuilder().serializeNulls().create().fromJson(json, JokerRuleForm.class);
When executing this line i got a NumberFormatException empty string and i think it dailyLimit's or date's fault because it's empty and fromJson() method can't do what he need to do. 执行此行时,我得到了NumberFormatException空字符串,并且我认为它是dailyLimit或date的错误,因为它为空,并且fromJson()方法无法执行他需要做的事情。
I've read something about a TypeAdapter that seems can fit to my case, but i don't really know how to proceed and i'm not sure is a valid solution. 我已经读过一些关于TypeAdapter的内容,看起来很适合我的情况,但是我真的不知道如何进行,而且我不确定这是一个有效的解决方案。
Can someone help me? 有人能帮我吗?
The limit fields eg dailyLimit
are empty strings in your JSON. 限制字段(例如, dailyLimit
是JSON中的空字符串。 This was suggested in JsonParseException when encountering an empty value for an int or long #472 issue but Gson team closed it because it makes no sense to parse ""
as int
. 当遇到int或long#472问题的空值时,在JsonParseException中提出了此建议,但Gson团队将其关闭,因为将""
解析为int
毫无意义。
One of the users provided a solution in his comment which allows to leniently parse the number values. 一位用户在他的评论中提供了一个解决方案,该解决方案可以轻松地解析数字值。 I'd not go this route myself and fix JSON instead, but it's up to you: 我不会自己走这条路线,而是要修复JSON,但这取决于您:
public static final TypeAdapter<Number> UNRELIABLE_INTEGER = new TypeAdapter<Number>() {
@Override
public Number read(JsonReader in) throws IOException {
JsonToken jsonToken = in.peek();
switch (jsonToken) {
case NUMBER:
case STRING:
String s = in.nextString();
try {
return Integer.parseInt(s);
} catch (NumberFormatException ignored) {
}
try {
return (int)Double.parseDouble(s);
} catch (NumberFormatException ignored) {
}
return null;
case NULL:
in.nextNull();
return null;
case BOOLEAN:
in.nextBoolean();
return null;
default:
throw new JsonSyntaxException("Expecting number, got: " + jsonToken);
}
}
@Override
public void write(JsonWriter out, Number value) throws IOException {
out.value(value);
}
};
public static final TypeAdapterFactory UNRELIABLE_INTEGER_FACTORY = TypeAdapters.newFactory(int.class, Integer.class, UNRELIABLE_INTEGER);
Gson gson = new GsonBuilder()
.registerTypeAdapterFactory(UNRELIABLE_INTEGER_FACTORY)
.create();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.