2014-11-12 3 views
0

현재 JSON과 내 객체를 구문 분석하는 데 Jackson을 사용하고 있습니다. 현재 개체를 JSON으로 변환하는 것은 객체에서 toString()을 호출 할 때 작동합니다. 그러나 JSON을 다시 객체로 변환하는 것은 점점 어려워지고 있습니다.Jackson을 사용하여 JSON을 객체로 구문 분석

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 
:이 작업을 테스트하기 위해, 나는 다음과 같은 라인을 실행하고 있습니다 :이 실행할 때,

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

이것은 (dummyUserAppData)와 함께 시작된 동일한 개체를 반환해야을, 나는 다음과 같은 오류가 발생합니다

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; 
    } 
} 

}

0,123,516 : dummyAppUserData는 클래스 UserAppData의이고, 다음과 같이 내가 사용

클래스는

그리고이 UserAppData가의 인스턴스를 가지고있는 작은 클래스 UserPackData입니다 :

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

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

}

무엇입니까 것을 내가 잘못은?

+0

'e.printStackTrace();'의 출력을 보여주세요. –

답변

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; 
} 

또는, (적절한 @JsonProperty 주석) 매개 변수가 생성자와 게터/세터를 제공한다.

관련 문제