Skip to content

Commit 6c71c39

Browse files
authored
Merge pull request #104 from microsoftgraph/vidadhee/AdditionalDataManagerError
Deserializing additional data throughout the object hierarchy
2 parents 614c871 + 20e8395 commit 6c71c39

File tree

1 file changed

+46
-0
lines changed

1 file changed

+46
-0
lines changed

src/main/java/com/microsoft/graph/serializer/DefaultSerializer.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,13 +100,59 @@ public <T> T deserializeObject(final String inputString, final Class<T> clazz, M
100100
}
101101

102102
jsonBackedObject.additionalDataManager().setAdditionalData(rawObject);
103+
setChildAdditionalData(jsonBackedObject,rawObject);
103104
return jo;
104105
} else {
105106
logger.logDebug("Deserializing a non-IJsonBackedObject type " + clazz.getSimpleName());
106107
return jsonObject;
107108
}
108109
}
109110

111+
/**
112+
* Recursively sets additional data for each child object
113+
*
114+
* @param serializedObject the parent object whose children will be iterated to set additional data
115+
* @param rawJson the raw json
116+
*/
117+
@SuppressWarnings("unchecked")
118+
private void setChildAdditionalData(IJsonBackedObject serializedObject, JsonObject rawJson) {
119+
// Use reflection to iterate through fields for eligible Graph children
120+
for (java.lang.reflect.Field field : serializedObject.getClass().getFields()) {
121+
try {
122+
Object fieldObject = field.get(serializedObject);
123+
124+
// If the object is a HashMap, iterate through its children
125+
if (fieldObject instanceof HashMap) {
126+
@SuppressWarnings("unchecked")
127+
HashMap<String, Object> serializableChildren = (HashMap<String, Object>) fieldObject;
128+
Iterator<Entry<String, Object>> it = serializableChildren.entrySet().iterator();
129+
130+
while (it.hasNext()) {
131+
Map.Entry<String, Object> pair = (Map.Entry<String, Object>)it.next();
132+
Object child = pair.getValue();
133+
134+
// If the item is a valid Graph object, set its additional data
135+
if (child instanceof IJsonBackedObject) {
136+
AdditionalDataManager childAdditionalDataManager = ((IJsonBackedObject) child).additionalDataManager();
137+
childAdditionalDataManager.setAdditionalData(rawJson.get(field.getName()).getAsJsonObject());
138+
setChildAdditionalData((IJsonBackedObject) child,rawJson.get(field.getName()).getAsJsonObject());
139+
}
140+
}
141+
}
142+
// If the object is a valid Graph object, set its additional data
143+
else if (fieldObject != null && fieldObject instanceof IJsonBackedObject) {
144+
IJsonBackedObject serializedChild = (IJsonBackedObject) fieldObject;
145+
AdditionalDataManager childAdditionalDataManager = serializedChild.additionalDataManager();
146+
147+
childAdditionalDataManager.setAdditionalData(rawJson.get(field.getName()).getAsJsonObject());
148+
setChildAdditionalData((IJsonBackedObject) fieldObject,rawJson.get(field.getName()).getAsJsonObject());
149+
}
150+
} catch (IllegalArgumentException | IllegalAccessException e) {
151+
logger.logError("Unable to access child fields of " + serializedObject.getClass().getSimpleName(), e);
152+
}
153+
}
154+
}
155+
110156
/**
111157
* Serializes an object into a string
112158
*

0 commit comments

Comments
 (0)