Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fastjson能不能添加一个容错机制,自动跳过数据类型不匹配的字段而不是抛异常 #854

Open
yanweiqiang opened this issue Oct 11, 2016 · 8 comments

Comments

@yanweiqiang
Copy link

yanweiqiang commented Oct 11, 2016

就是cyberdak说的那种情况,我看过你们的源码,虽然可以自己更改,but我觉得官方提供这种功能会更好一些

@wenshao
Copy link
Member

wenshao commented Oct 20, 2016

能提供你遇到问题的testcase么?好让我实现之后能够满足你的需求

@cyberdak
Copy link

我觉得楼主的case应该是这样的

package com.cyberdak.fastjson;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

public class Model {
    private String a;
    private int b;
    public String getA() {
        return a;
    }
    public void setA(String a) {
        this.a = a;
    }
    public int getB() {
        return b;
    }
    public void setB(int b) {
        this.b = b;
    }

    public Model() {
        super();
    }

    public Model(String a, int b) {
        super();
        this.a = a;
        this.b = b;
    }

    public static void main(String[] args) {
        Model model = new Model("a",1);
        JSONObject obj = JSONObject.parseObject(JSON.toJSONString(model));
        obj.put("b", "v");
        Model newModel = JSONObject.parseObject(obj.toString(), Model.class);
    }

}

会抛出一下异常

Exception in thread "main" com.alibaba.fastjson.JSONException: For input string: "v"
    at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:625)
    at com.alibaba.fastjson.JSON.parseObject(JSON.java:339)
    at com.alibaba.fastjson.JSON.parseObject(JSON.java:243)
    at com.alibaba.fastjson.JSON.parseObject(JSON.java:456)
    at com.cyberdak.fastjson.Model.main(Model.java:44)
Caused by: java.lang.NumberFormatException: For input string: "v"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:580)
    at java.lang.Integer.parseInt(Integer.java:615)
    at com.alibaba.fastjson.util.TypeUtils.castToInt(TypeUtils.java:531)
    at com.alibaba.fastjson.serializer.IntegerCodec.deserialze(IntegerCodec.java:89)
    at com.alibaba.fastjson.parser.deserializer.DefaultFieldDeserializer.parseField(DefaultFieldDeserializer.java:69)
    at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.parseField(JavaBeanDeserializer.java:689)
    at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:570)
    at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.parseRest(JavaBeanDeserializer.java:822)
    at com.alibaba.fastjson.parser.deserializer.FastjsonASMDeserializer_1_Model.deserialze(Unknown Source)
    at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:185)
    at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:621)
    ... 4 more

但是这种抛出异常的机制是 fail-fast 的理念,也许可以添加一个 fail-fast 为 false 的选项?

@LeosinZhang
Copy link

我也觉得容错机制是个不错的想法。这样在解析时,不会因为某一条数据的异常导致整个解析失败。

@THEONE10211024
Copy link

是的,类似Android 原生Json里的opt方法

@halfhq
Copy link

halfhq commented Jun 19, 2017

以前我也提过同需求 #1227

@TommyLemon
Copy link

@wenshao
太需要了,php后台经常把 {} 转成 [] 返回,非常恶心。
他们说是php的json_encode函数自动转的,只能每个空对象手动转成 null 返回。
但有次php改了接口,这个问题又出现了,线上的app没有try-catch就挂了。
还好挂的那段代码不是我写的/汗。

fastjson目前有WriteNullArrayAsEmpty这种属性了,所以希望加几个 WriteEmptyArrayAsNull 这样的属性,比忽略异常更管用,非常感谢。

@TommyLemon
Copy link

我们目前是只能在JSON String转JavaBean前
先转JSONObject,然后遍历key:value
如果value是空数组 [] 就remove掉,
再toJSONString,
最后再转JavaBean。

@hsl727261250
Copy link

这个问题还没解决吗?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

8 participants