2015-05-19 13 views
7

Ich habe eine Zeichenfolge wie - {"state":1,"cmd":1}, ich muss dies mit generierten Ausgang vergleichen, aber in der generierten Ausgabe die Reihenfolge ändert sich manchmal sein {"state":1,"cmd":1} anderen Zeiten seine {"cmd":1,"state":1}.Wie zwei JSON-Strings zu vergleichen, wenn die Reihenfolge der Einträge ändern

Momentan verwendete ich equals() Methode, um zu vergleichen, Was kann in diesem Szenario besser sein, um die zwei Zeichenfolgen zu überprüfen. Meine Sorge ist nur, dass beide Einträge in String vorhanden sind, Reihenfolge ist nicht imp.

+7

die Saiten Parse, konstruieren zwei Instanzen ein verwenden benutzerdefinierte Klasse und vergleichen Sie sie. –

+1

'equals' ist nicht dasselbe wie * comparing *. * Vergleichen * bedeutet, dass es eine Ordnungsbeziehung gibt, während * Gleichheitsprüfungen * prüft, ob zwei Objekte gleich sind. –

+0

Sie müssen etwas anspruchsvoller schreiben, wie es @kocko vorgeschlagen hat. Parsen Sie die Zeichenfolge für das, was Sie interessiert und vergleichen Sie dann. – Juru

Antwort

8

Jackson Json parser hat eine nette Eigenschaft, dass es eine JSON-Schnur in eine Karte parsen kann. Anschließend können Sie die Einträge abfragen oder einfach fragen auf Gleichheit:

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

Der Ausgang ist

{state=1, cmd=1} 
{cmd=1, state=1} 
true 
+3

es ist nicht anwendbar im Falle einer Liste in der Json Nutzlast –

0

Versuchen Sie, diese

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 

Ich vertraue Ihnen dies hilfreich ist.

+0

danke Siva ... das sieht nützlich aus, hoffentlich wird es in meinem Projekt gut laufen ..will deine ANS danach akzeptieren, tx !! – Green

0

Sie können einfach eine Klasse verwenden, Ihr Objekt und JSONObject definieren Ihr JSON-Objekt zu analysieren und seine Eigenschaften erhalten:

Java-Klasse:

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

Ihr Parsing so sein sollte:

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")); 

Und dann, wenn Sie die zwei Objekte haben, können Sie leicht ihre Eigenschaften vergleichen.

+0

sehr nützlich, danke viel, wird das verwenden !! ... sehr einfach zu ..will akzeptieren nach dem Versuch – Green

+0

Großartig, froh, dass es hilft. –

+0

.... tx viel für Ihre Antwort ..es nützlich, aber ich habe nicht in meinem Code verwendet ... für mein Szenario mit einer Karte ist besser ..... aber tx !! – Green

10

Sie können auch Gson API

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)); 
+0

Nicht in Gson arbeiten 1.7.1 – Dherik

+2

funktioniert für Gson 2.2.4 – nieschumi

+0

Wenn diese beiden JsonElement nicht ähnlich sind dann können wir herausfinden, welche der Komponenten sind unähnlich?? – drp