GSON을 사용하여 일부 JSON 파일을 비 직렬화합니다. 다음은 필자가 작성한 비 직렬화 방법입니다. JSON 파일을 읽고 전체를이 메서드에 전달하는 문자열로 저장합니다. 이 방법은이 프로젝트와 관련된 5 개의 JSON 파일 중 4 개에서 성공적으로 작동합니다.GSON을 사용하는 JSON 비 직렬화는 해시 맵에서 해시 맵의 데이터 멤버를 건너 뜁니다.
protected ArrayList<Entry> deserialize(String json) throws Exception
{
ArrayList<Entry> list = new ArrayList<Entry>();
JsonParser parser = new JsonParser();
JsonArray jarray = (JsonArray) parser.parse(json);
for (int i = 0; i < jarray.size(); i++)
{
// Parse out the brand
JsonObject jentry = (JsonObject) jarray.get(i);
JsonPrimitive jbrand = jentry.getAsJsonPrimitive("brand");
String className = jbrand.getAsString();
Entry entry = (Entry) gson.fromJson(jentry, Class.forName(className));
list.add(entry);
}
return list;
}
가 여기 구문 분석하고 문자열에 넣어 JSON 파일의 존재 'jentry'에 결합 얻을 여러 개체를 있어요하지만 난 그냥 하나를 포함합니다. 그것이 이상하게 보일 경우 FireFox 플러그인을 사용하여 JSON 파일을 보았고 해당 플러그인에서 복사/붙여 넣기했기 때문일 수 있습니다.
[
*
-
{
o pattern: "3 5 * * 1-5"
o starts: 1288249260913
o ends: 1291125660913
o skipHolidays: false
o lastFired: 1289988180395
o
-
template: {
+ location: ""
+ damageCause: ""
+ signed: false
+ signedBy: ""
+ approvedBy: "Ralph"
+ requestedBy: "Ralph"
+ estHours: 0
+ actHours: 0
+ chargeTo: ""
+ priority: "ROUTINE"
+ reason: ""
+ materials: ""
+ serviceId: 1
+ descr: "HELP WITH LEAVES,BLOW LEAVES IN YOUR AREA NEAR DRAINS Check for garbage. [sp] Mow and weedeat where needed in your area. [sp] Work on leaves where needed. [wi]"
+ comments: [ ]
+ futureId: 3
+ inventoryId: -1
+
-
trail: [
#
-
{
* stamp: 1288026816857
* status: "OPEN"
* byId: 2
}
#
-
{
* stamp: 1288026889374
* status: "DISPATCHED"
* byId: 2
}
#
-
{
* stamp: 1288194095170
* status: "DISPATCHED"
* byId: 2
}
#
-
{
* stamp: 1288287964481
* status: "DISPATCHED"
* byId: 2
}
#
-
{
* stamp: 1288785076532
* status: "DISPATCHED"
* byId: 2
}
#
-
{
* stamp: 1288797119525
* status: "DISPATCHED"
* byId: 2
}
#
-
{
* stamp: 1289307416921
* status: "DISPATCHED"
* byId: 2
}
#
-
{
* stamp: 1289308339165
* status: "DISPATCHED"
* byId: 2
}
#
-
{
* stamp: 1289834523635
* status: "DISPATCHED"
* byId: 2
}
#
-
{
* stamp: 1289847660913
* status: "DISPATCHED"
* byId: 2
}
]
+ requestDate: 1289329260913
+ assignedDate: 1288029660912
+ supplies: [ ]
+ id: 3
+ updateDate: 1289847660913
+ createUserId: 2
+ updateUserId: 2
+ createDate: 1288026816857
+ brand: "org.workplicity.marist.grounds.GroundsRequest"
}
o workSlateId: 16
o serviceId: 1
o enabled: false
o id: 3
o updateDate: 1291235385719
o createUserId: 2
o updateUserId: 2
o createDate: 1288026889373
o brand: "org.workplicity.entry.event.Weekdays"
}
문제는 GSON이 JSON (직렬화?)으로 되돌아 가면 일부 필드가 누락된다는 것입니다. 결과는 다음과 같습니다. 관련 누락 된 줄은 'template :'아래와 'serviceID :'아래의 모든 항목입니다. 전체 개체를 다시 포함합니다.
[
*
-
{
o pattern: "3 5 * * 1-5"
o starts: 1288249260913
o ends: 1291125660913
o skipHolidays: false
o lastFired: 1289988180395
o
-
template: {
+ serviceId: 1
+ descr: "HELP WITH LEAVES,BLOW LEAVES IN YOUR AREA NEAR DRAINS Check for garbage. [sp] Mow and weedeat where needed in your area. [sp] Work on leaves where needed. [wi]"
+ comments: [ ]
+ futureId: 3
+ inventoryId: -1
+
-
trail: [
#
-
{
* stamp: 1288026816857
* status: "OPEN"
* byId: 2
}
#
-
{
* stamp: 1288026889374
* status: "DISPATCHED"
* byId: 2
}
#
-
{
* stamp: 1288194095170
* status: "DISPATCHED"
* byId: 2
}
#
-
{
* stamp: 1288287964481
* status: "DISPATCHED"
* byId: 2
}
#
-
{
* stamp: 1288785076532
* status: "DISPATCHED"
* byId: 2
}
#
-
{
* stamp: 1288797119525
* status: "DISPATCHED"
* byId: 2
}
#
-
{
* stamp: 1289307416921
* status: "DISPATCHED"
* byId: 2
}
#
-
{
* stamp: 1289308339165
* status: "DISPATCHED"
* byId: 2
}
#
-
{
* stamp: 1289834523635
* status: "DISPATCHED"
* byId: 2
}
#
-
{
* stamp: 1289847660913
* status: "DISPATCHED"
* byId: 2
}
]
+ requestDate: 1289329260913
+ assignedDate: 1288029660912
+ supplies: [ ]
+ id: 3
+ updateDate: 1289847660913
+ createUserId: 2
+ updateUserId: 2
+ createDate: 1288026816857
+ brand: "org.workplicity.marist.grounds.GroundsRequest"
}
o workSlateId: 16
o serviceId: 1
o enabled: false
o id: 3
o updateDate: 1299694066807
o createUserId: 2
o updateUserId: 2
o createDate: 1288026889373
o brand: "org.workplicity.entry.event.Weekdays"
}
이는 JSON 파일의 모든 개체에 대해 발생합니다. NetBeans에서 디버깅을하면 JsonObject 'jentry'에 JSON 문자열의 각 데이터 멤버에 해당하는 키 값 쌍이있는 해시 테이블이 있다는 사실이 밝혀졌습니다. '템플릿'은이 해시 테이블 내에서 해시 테이블로 저장됩니다.이 해시 테이블은 문제가 될 수도 있고 아닐 수도 있습니다. 솔직히 알아낼 수 없었습니다. 아니 -
Entry entry = (Entry) gson.fromJson(jentry, Class.forName(className));
이 문제는이 특정 JSON 파일과 관련된 특정 클래스가 가지고 있지 않은 것이 었습니다 : 내가 처음에 문제 JSON 파일에이 방법을 실행했을 때
지금은이 라인에서 예외를 얻었다 인수 생성자는 그래서 너무처럼 GSON 빌더 일부 InstanceCreators을 등록했다 :
gsonBuilder.registerTypeAdapter(Weekdays.class, new WeekdaysInstanceCreator());
gsonBuilder.registerTypeAdapter(Once.class, new OnceInstanceCreator());
나는 예외가 발생하고 모든 일 것으로 보인다 뺀 물론 누락 된 필드되고 멈춘있었습니다.
그것이 내가있는 곳입니다. 나는 무엇이 잘못 될지를 놓치고 있습니다. 전혀 도움이된다면 크게 감사하겠습니다.