使用Jackson将JSON字符串或对象反序列化为String字段

时间:2017-03-11 20:05:58

标签: java json jackson

我正在使用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);

2 个答案:

答案 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]