[alibaba/fastjson]JSONObject序列化成JavaBean时报错

2024-05-23 509 views
6

com.alibaba.fastjson.JSONException: set property error, logoImage at com.alibaba.fastjson.util.TypeUtils.castToJavaBean(TypeUtils.java:1084) at com.alibaba.fastjson.util.TypeUtils.cast(TypeUtils.java:701) at com.alibaba.fastjson.JSON.toJavaObject(JSON.java:1004) Caused by: com.alibaba.fastjson.JSONException: set property error, description_CN at com.alibaba.fastjson.parser.deserializer.FieldDeserializer.setValue(FieldDeserializer.java:162) at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.createInstance(JavaBeanDeserializer.java:1254) at com.alibaba.fastjson.util.TypeUtils.castToJavaBean(TypeUtils.java:1082) ... 3 more Caused by: java.lang.NullPointerException at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:567) at com.alibaba.fastjson.parser.deserializer.FieldDeserializer.setValue(FieldDeserializer.java:110) ... 5 more

源码如下: `String s = "[{\"logoImage\":\"asd\",\"description_CN\":\"中国建设银行官网\",\"location\":{\"country\":\"CN\"},\"category\":\"bank\",\"httpResponse\":\"\r\n{\r\n “data“:“B2CMainPlatP1“,\r\n “domain“:““\r\n} \",\"name_CN\":\"中国建设银行\",\"url\":\"https://ibsbjstar.ccb.com.cn/CCBIS/V6/common/login.jsp\"}]";

JSONArray error2 = (JSONArray) JSON.parse(s); for (Object j : error2) { System.out.println(((JSONObject) j).toJavaObject(APIBase.class)); }`

请问哪里出了问题???

回答

6

你的apibases类是啥,你不贴在这吗?别人怎么帮你看

5

`@SuppressWarnings("serial") public abstract class APIBase implements APIStructure, Serializable {

`

你的apibases类是啥,你不贴在这吗?别人怎么帮你看

`import com.github.houbb.csv.annotation.Csv; import com.alibaba.fastjson.annotation.JSONField; import com.alibaba.fastjson.serializer.JSONSerializer; import com.alibaba.fastjson.serializer.ObjectSerializer; import com.alibaba.fastjson.serializer.SerializeWriter; import com.alibaba.fastjson.serializer.SerializerFeature; @SuppressWarnings("serial") public abstract class APIBase implements APIStructure, Serializable {

@Csv(label = "接口描述")
private String description_CN;// 描述
public String getDescription_CN() {
    return description_CN;
}

public void setDescription_CN(String description_CN) {
    this.description_CN = description_CN;
}

/**
 * @Fields 圖標完整路徑
 * @required false
 */
@Csv(writeRequire = false)
private String logoImage;
public String getLogoImage() {
    return logoImage;
}

public void setLogoImage(String logoImage) {
    this.logoImage = logoImage;
}

@Csv(label = "網站所在地區")
@JSONField(serialzeFeatures = SerializerFeature.QuoteFieldNames) 
private HashMap<String, String> location = new HashMap<String, String>() {
    {
        put("country", "CN");
    }
};
public void setLocation(HashMap<String, String> location) {
    this.location = location;
}

public String getLogoImage() {
    return logoImage;
}

@Csv(label = "分類")
private String category;
public String getCategory() {
    return category;
}

public void setCategory(String category) {
    this.category = category;
}

@Csv(label = "回顯")
@JSONField(serialzeFeatures = SerializerFeature.DisableCheckSpecialChar)
private String httpResponse;
public String getHttpResponse() {
    return httpResponse;
}

public void setHttpResponse(String httpResponse) {
    this.httpResponse = httpResponse;
}

private String name_EN;
public String getName_CN() {
    return name_CN;
}

public void setName_CN(String name_CN) {
    this.name_CN = name_CN;
}

@Csv(writeRequire = false)
private URL url;// 测试url
public String getUrl() {
    return url.toString();
}

public void setUrl(String url) {
    try {
        this.url = new URL(url);
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}`

2

如果你要正常使用,需要修改以下两点,1.是把类的abstract 去掉,不要使用抽象类 2. url 的类型需要修改为String,fastjson在调用set方法的时候事通过属性来调用的而不是通过构造set方法调用。 你可以这样做去规避这样的问题。

6

如果你要正常使用,需要修改以下两点,1.是把类的abstract 去掉,不要使用抽象类 2. url 的类型需要修改为String,fastjson在调用set方法的时候事通过属性来调用的而不是通过构造set方法调用。 你可以这样做去规避这样的问题。

测试了下把abstract去掉就可以了,请问有办法支持抽象类吗?