我正在使用Jackson 2库,我正在尝试阅读JSON响应,如下所示:
{ "value":"Hello" }
当值为空时,JSON响应如下所示:
{ "value":{} }
我的模型POJO类看起来像这样
public class Hello {
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
问题是,当响应看起来像{value:{}}时,Jackson正在尝试读取一个Object,但我的模型类字段是一个字符串,所以它抛出异常:
JsonMappingException: Can not deserialize instance of java.lang.String out of START_OBJECT token.
我的问题是杰克逊如何成功阅读看起来像的JSON:
{"value":"something"}
同时如果响应看起来像{" value":{}}(我的空响应),则将null传递给我的Hello模型类的value字段。
我正在使用下面的代码来读取JSON字符串:
String myJsonAsString = "{...}";
ObjectMapper mapper = new ObjectMapper();
mapper.readValue(myJsonAsString , Hello.class);
答案 0 :(得分:5)
您可以为此feld使用自定义反序列化程序。如果它在那里则返回一个字符串,或者在任何其他情况下返回null:
public class Hello {
@JsonDeserialize(using = StupidValueDeserializer.class)
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
public class StupidValueDeserializer extends JsonDeserializer<String> {
@Override
public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
JsonToken jsonToken = p.getCurrentToken();
if (jsonToken == JsonToken.VALUE_STRING) {
return p.getValueAsString();
}
return null;
}
}
答案 1 :(得分:1)
JB Nizet 的 Txh,但如果您获得 String 以外的类型(例如 Object),Jackson 反序列化器会尝试反序列化内部 Object,并可能引发潜在异常。之后,json中的其他字段在Java中填充为null。
为了避免这种情况,你会忽略孩子
teams = df['HomeTeam'].unique().tolist()
for team in teams:
df1 = df[(df['HomeTeam'] == team) | (df['AwayTeam'] == team)]
df1['Win'] = False
for i in range(len(df1)):
if df1['HomeTeam'].iloc[i] == team:
if df1['HG'].iloc[i] > df1['AG'].iloc[i]:
df1['Win'].iloc[i] = True
elif df1['AwayTeam'].iloc[i] == team:
if df1['HG'].iloc[i] < df1['AG'].iloc[i]:
df1['Win'].iloc[i] = True
df1['Rolling'] = 0
for i in range(1,len(df)):
df1['Rolling'].iloc[i] = df1['Win'].iloc[:i].sum() / int(i)
for i in range(len(df1)):
if df1['HomeTeam'].iloc[i] == team:
df['HomeRolling'].loc[df1.index[i]] = df1['Rolling'].iloc[i]
elif df1['AwayTeam'].iloc[i] == team:
df['AwayRolling'].loc[df1.index[i]] = df1['Rolling'].iloc[i]