J'utilise gSOAP (en C) pour une application cliente qui appelle un service Web Java. J'utilise la fonction json_call()
. J'ai une structure de requête remplie avec les données d'entrée JSON et j'obtiens une structure de réponse remplie avec les données de sortie JSON du service Java. Les deux JSON ont la même structure en général, mais peuvent avoir plus, moins ou changé d'éléments.gSOAP: Comment comparer deux structures de valeur (avec un contenu JSON) en C?
Ma tâche est maintenant de savoir dans quels éléments la réponse est différente de la requête. Le principal élément est un grand tableau avec beaucoup de membres, comme:
{
"objects": [
{
"@id": "OBJ00001",
"name": "value",
...
},
{
"@id": "OBJ00002",
"number": 123,
...
},
...
]
}
je peux identifier tout objet du même genre avec le champ @id
.
ESt simple à itérer le tableau objects
avec quelque chose comme:
for(i = 0; i < has_size(value_at(response, "objects")); i++)
Mais I'missing alors une fonction, qui permet de comparer les membres (« objets ») avec le même @id
à la demande et la réponse. Quelque chose comme « findMemberWithSameField », puis « égale » (tous deux n'existe pas!):
struct member *currentMemberInResponse = NULL;
struct member *memberWithSameField = NULL;
for(i = 0; i < has_size(value_at(response, "objects")); i++)
{
/* get the current member out of the response array */
currentMemberInResponse = nth_value(value_at(response, "objects"), i);
/* Find member/object with same @id in request */
memberWithSameField = findMemberWithSameField(value_at(request, "objects"), currentMemberInResponse , "@id"));
/* equal is true if all fields are the same */
if(equal(currentMemberInResponse, memberWithSameField))
{
/* Do nothing, because nothing changed */
}
else
{
/* Do something */
}
}
Toute idée sur cette tâche? Sinon, je dois écrire mes propres "findMemberWithSameField" et "euqal".
Amitiés Daniel
ici jetez un oeil à https://github.com/DaveGamble/cJSON il a le support de patch jSON –