web-dev-qa-db-fra.com

Comment comparer deux chaînes JSON lorsque l'ordre des entrées change constamment

J'ai une chaîne du type - {"state":1,"cmd":1}, il faut que je compare cela à la sortie générée, mais dans la sortie générée, l'ordre ne cesse de changer, c'est-à-dire parfois son {"state":1,"cmd":1}, parfois son {"cmd":1,"state":1}

Actuellement, j'utilisais la méthode equals() pour comparer, quelle meilleure façon dans ce scénario de valider les deux chaînes. Mon souci est juste que les deux entrées sont présentes dans la chaîne, ordre n'est pas imp.

9
Green

Jackson Json parser a une fonctionnalité intéressante qui permet d’analyser une chaîne Json dans une carte. Vous pouvez ensuite interroger les entrées ou simplement demander l'égalité: 

import com.fasterxml.jackson.databind.ObjectMapper;

import Java.util.*;

public class Test
{
    public static void main(String... args)
    {
        String input1 = "{\"state\":1,\"cmd\":1}";
        String input2 = "{\"cmd\":1,\"state\":1}";
        ObjectMapper om = new ObjectMapper();
        try {
            Map<String, Object> m1 = (Map<String, Object>)(om.readValue(input1, Map.class));
            Map<String, Object> m2 = (Map<String, Object>)(om.readValue(input2, Map.class));
            System.out.println(m1);
            System.out.println(m2);
            System.out.println(m1.equals(m2));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

La sortie est 

{state=1, cmd=1}
{cmd=1, state=1}
true
10
Sharon Ben Asher

Vous pouvez également utiliser l'API Gson 

 JsonParser parser = new JsonParser();
 JsonElement o1 = parser.parse("{\"state\":1,\"cmd\":1}");
 JsonElement o2 = parser.parse("{\"cmd\":1,\"state\":1}");
 System.out.println(o1.equals(o2));
10
Rockstar

Essaye ça

 import Java.util.*;
 import com.google.gson.*;

 public class CompareArray {
   static Set<JsonElement> setOfElements(JsonArray arr) {
      Set<JsonElement> set = new HashSet<JsonElement>();
      for (JsonElement j: arr) {
          set.add(j);
        }
        return set;
    }

    public static void main(String[] args) {
        JsonParser parser = new JsonParser();
        Set<JsonElement> arr1elems =
setOfElements(parser.parse(args[0]).getAsJsonArray());
        Set<JsonElement> arr2elems =
setOfElements(parser.parse(args[1]).getAsJsonArray());
        System.out.println("Arrays match? " + arr1elems.equals(arr2elems));
    }
}

$ Java -cp .:gson-2.2.2.jar CompareArray '[{"key1":"value1"},
{"key2":"value2"}, {"key3":"value3"}]' '[{"key3":"value3"},
{"key1":"value1"}, {"key2":"value2"}]'
Arrays match? true 

J'espère que cela vous est utile.

0
Siva Sonai

Vous pouvez simplement utiliser une classe pour définir votre objet et JSONObject pour analyser votre objet JSON et obtenir ses propriétés:

Classe Java:

public class MyObject{
     private String state; //either int or String
     private String cmd;
     //getters and setters
}

Votre analyse devrait être comme ceci:

MyObject obj = new MyObject();
JSONParser jsonParser = new JSONParser();
 // input is your string here
JSONObject jsonObject = (JSONObject) jsonParser.parse(input);

//get properties here and set them in your object
obj.setState(jsonObject.get("state"));
obj.setCmd(jsonObject.get("cmd"));

Et ensuite, lorsque vous avez les deux objets, vous pouvez facilement comparer leurs propriétés.

0
cнŝdk