2015-05-19 9 views
7

mam ciąg jak - {"state":1,"cmd":1}, muszę porównać to z generowanej mocy, ale w generowanym wyjściu kolejność wciąż się zmienia to czasami jego {"state":1,"cmd":1} inne czasy jego {"cmd":1,"state":1}.Jak porównać dwa ciągi JSON gdy kolejność zgłoszeń ciągle się zmienia

Obecnie używałem metody equals() do porównania, co może być lepszym sposobem w tym scenariuszu do sprawdzenia poprawności dwóch łańcuchów. Moją obawą jest to, że oba wpisy są obecne w łańcuchu, kolejność nie jest imp.

+7

Przetwarza sznurki, skonstruować dwie instancje niestandardową klasę i porównaj je. –

+1

'równa się' to nie to samo co * porównywanie *. * Porównywanie * oznacza, że ​​istnieje relacja zleceń, podczas gdy * sprawdzanie równości * sprawdza, czy dwa obiekty są takie same. –

+0

Będziesz musiał napisać coś bardziej wyrafinowanego, na przykład sugerowanego przez @kocko. Przetwórz ciąg dla tego, co cię interesuje i porównaj to. – Juru

Odpowiedz

8

Jackson Json parser ma fajną cechę, że może sparsować ciąg JSONA do mapy. Następnie można zapytać wpisy lub po prostu poprosić o równości:

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

wyjście jest

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

nie ma zastosowania w przypadku listy w json ładunku danych –

0

Spróbuj

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 

ufam to pomocne dla Ciebie.

+0

dziękuję Siva ... wygląda to na pożyteczne, miejmy nadzieję, że będzie działał w moim projekcie dobrze .. zaakceptuje twoje ans po tym, tx !! – Green

0

można po prostu użyć klasy zdefiniować swój przedmiot i JSONObject przeanalizować swój obiekt JSON i dostać swoje właściwości:

Java Class:

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

Twój parsowanie powinien wyglądać następująco:

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

A potem, gdy masz dwa obiekty, możesz łatwo porównać ich właściwości.

+0

bardzo przydatne, dziękuję bardzo, użyje tego !! ... bardzo proste też ... zaakceptuje po wypróbowaniu – Green

+0

Świetnie, cieszę się, że pomaga. –

+0

.... tx dużo za ur odpowiedź .. przydatny, ale nie użyłem w moim kodzie ... dla mojego scenariusza przy użyciu mapy jest lepiej ..... ale tx !! – Green

10

Można również użyć 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

Nie działa w Gson 1.7.1 – Dherik

+2

działa dla Gson 2.2.4 – nieschumi

+0

Jeśli te dwa JsonElement nie są podobne, to możemy dowiedzieć się, które z nich są komponenty niepodobny?? – drp

Powiązane problemy