【问题标题】:Parsing JSON to Object using Jackson使用 Jackson 将 JSON 解析为对象
【发布时间】:2014-11-12 01:38:14
【问题描述】:

我目前正在使用 Jackson 来解析我的对象与 JSON 之间的关系。目前,当我在对象上调用 toString() 时,可以将对象转换为 JSON。但是将 JSON 转换回对象变得越来越困难。为了测试这个工作,我正在运行以下行:

UserAppData test = UserAppData.appDataFromJSON(dummyUserAppData.toString());

这应该返回以 (dummyUserAppData) 开头的相同对象,但是,当我运行它时收到以下错误:

java.lang.RuntimeException: Unable to start activity ComponentInfo{appuccino.droidpacks/com.appuccino.droidpacks.activities.MainActivity}: java.lang.RuntimeException: bad input {
"boughtAppIDs" : [ 1, 2, 3, 4, 5 ],
"boughtAppPacks" : [ {
"gold" : true,
"id" : 1
}, {
"gold" : false,
"id" : 2
}, {
"gold" : true,
"id" : 6
} ]
}
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
        at android.app.ActivityThread.access$800(ActivityThread.java:135)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5001)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
        at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.RuntimeException: bad input {
"boughtAppIDs" : [ 1, 2, 3, 4, 5 ],
"boughtAppPacks" : [ {
"gold" : true,
"id" : 1
}, {
"gold" : false,
"id" : 2
}, {
"gold" : true,
"id" : 6
} ]
}
        at com.appuccino.droidpacks.objects.UserAppData.appDataFromJSON(UserAppData.java:48)
        at com.appuccino.droidpacks.activities.MainActivity.onCreate(MainActivity.java:108)
        at android.app.Activity.performCreate(Activity.java:5231)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148)
        ... 11 more

我使用的类如下,其中 dummyAppUserData 属于 UserAppData 类:

public class UserAppData {

public int[] boughtAppIDs;
public UserPackData[] boughtAppPacks;

public UserAppData(int[] list, UserPackData[] packData){
    boughtAppIDs = list;
    boughtAppPacks = packData;
}

public static UserAppData appDataFromJSON(String json){
    if (json == null || json.isEmpty()) {
        return null;
    }
    ObjectMapper mapper = new ObjectMapper();
    ObjectWriter writer = mapper.writerWithDefaultPrettyPrinter();
    UserAppData myObject;
    try {
        myObject = mapper.readValue(json, UserAppData.class);
        return myObject;
    }
    catch (  JsonParseException e) {
        e.printStackTrace();
        return null;
    }
    catch (  Exception e) {
        e.printStackTrace();
        throw new RuntimeException("bad input " + json);
    }
}

@Override
public String toString(){
    //ObjectWriter ow = new ObjectMapper().writer();//.withDefaultPrettyPrinter();
    ObjectMapper mapper = new ObjectMapper();
    try {
        return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(this);
        //return ow.writeValueAsString(this);
    } catch (JsonProcessingException e) {
        e.printStackTrace();
        return null;
    }
}

}

这是 UserAppData 有一个实例的小类 UserPackData:

public class UserPackData {
public int id;
public boolean gold;

public UserPackData(int i, boolean g){
    id = i;
    gold = g;
}

}

我做错了什么?

【问题讨论】:

  • 向我们展示e.printStackTrace();的输出。

标签: java android json jackson


【解决方案1】:

你没有正确定义你的构造函数让杰克逊使用它们。您需要通过使用@JsonProperty 注释其参数来将每个构造函数标识为要使用的构造函数。

public UserAppData(@JsonProperty("boughtAppIDs") int[] boughtAppIDs, @JsonProperty("boughtAppPacks") UserPackData[] boughtAppPacks) {
    this.boughtAppIDs = boughtAppIDs;
    this.boughtAppPacks = boughtAppPacks;
}
...
public UserPackData(@JsonProperty("id") int id, @JsonProperty("gold") boolean gold) {
    this.id = id;
    this.gold = gold;
}

或者,提供无参数构造函数和 getter/setter(带有适当的 @JsonProperty 注释)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-08
    • 2014-12-22
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    相关资源
    最近更新 更多