2015-05-19 47 views
7

Ho una stringa come - {"state":1,"cmd":1}, ho bisogno di confrontarla con l'output generato ma nell'output generato l'ordine continua a cambiare, a volte il suo {"state":1,"cmd":1} altre volte il suo {"cmd":1,"state":1}.Come confrontare due stringhe JSON quando l'ordine delle voci continua a cambiare

Attualmente stavo usando il metodo equals() per confrontare, quello che può essere il modo migliore in questo scenario per convalidare le due stringhe. La mia preoccupazione è che entrambe le voci siano presenti nella stringa, che l'ordine non sia imp.

+7

Analizzare le corde, la costruzione di due istanze di un classe personalizzata e confrontarli. –

+1

'equals' non è uguale a * confronto *. * Confrontare * significa che esiste una relazione di ordine, mentre * controlli di uguaglianza * si verifica se due oggetti sono uguali. –

+0

Dovrai scrivere qualcosa di più sofisticato come suggerito da @kocko. Analizza la stringa per ciò che ti interessa e confronta quindi. – Juru

risposta

8

Jackson Json parser ha una bella funzionalità che può analizzare una stringa Json in una mappa. È quindi possibile interrogare le voci o semplicemente chiedimi in materia di parità:

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

L'uscita è

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

non è applicabile nel caso di un elenco nel carico utile json –

0

Prova questa

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 

mi fido di questo è utile a voi.

+0

grazie Siva ... sembra utile, spero che nel mio progetto si svolga bene .. accetterò le tue e poi, grazie !! – Green

0

Si può semplicemente utilizzare una classe per definire l'oggetto e JSONObject per analizzare l'oggetto JSON e ottenere le sue proprietà:

Java Classe:

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

tua analisi dovrebbe essere simile a questo:

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

E quindi quando si hanno i due oggetti è possibile confrontare facilmente le loro proprietà.

+0

molto utile, grazie mille, userà questo !! ... molto semplice anche ... accetto dopo aver provato – Green

+0

Grande, felice che aiuta. –

+0

.... tx molto per la risposta ... è utile ma non l'ho usato nel mio codice ... per il mio scenario usando una mappa è meglio ..... ma tx !! – Green

10

È inoltre possibile utilizzare 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

Non funziona in Gson 1.7.1 – Dherik

+2

funziona per Gson 2.2.4 – nieschumi

+0

Se questi due JsonElement non sono simili, allora possiamo capire che quali di questi componenti sono dissimile?? – drp