2016-04-11 5 views
0

wo ich überprüfen möchte, welche Elemente der ersten Datei fehlen in der zweiten. HierJSON-Datei parsen und über spezifische Parameter iterieren

ist die Form des ersten:

[ 
    { 
     "pId": "pId1", 
     "Platform":["ios","and","web","winph","win"], 
     "Name": "ay", 
     "ShortDescription": "Mobi", 
     "Detail" : { 
      "IncentiveInformation": "ppp", 
      "DisplayName" : "vvv!", 
      "Description" : "mmm", 
      "TermsAndConditions": ".." 
     } 
    }, 
    { 
     "pId": "pId2", 
     "Platform":["afasd","sdfsd","pppp","asdas","win"], 
     "Name": "ay", 
     "ShortDescription": "mob", 
     "PromotionDetail": { 
      "DebugMode": false, 
      "PromoDate": ["2015.01.01-00:01","2015.01.01-23:59"], 
      "IncentiveInformation": "PRO", 
      "Name": "iTunes", 
      "ShortDescription": "Punkte sammeln bei iTunes", 
      "DisplayName": null, 
      "Description": null, 
      "ImageURL": null, 
      "JumpToShopURL": "urlHere", 
      "JumpToShopName" : "Zu iTunes" 
     } 
    }, 
    { 
     "pId": "pId3", 
     "Platform":["wqdsa"], 
     "Name": "poti", 
     "ShortDescription": "pun", 
     "ImageURL": "url.here", 
     "Promotion" : false,   
     "PromotionDetail": { 
      "DebugMode": false, 
      "PromoDate": ["2015.01.01-00:00","2015.01.01-23:59"], 
      "IncentiveInformation": "ppeur", 
      "Name": "namehere", 
      "ShortDescription": "tune", 
      "DisplayName": null, 
      "Description": null, 
      "ImageURL": null, 
      "JumpToShopURL": "noq", 
      "JumpToShopName" : "Zu" 
     } 
    } 

] 

und hier ist die Form der zweiten ein:

{ 
    "pList": [{ 
     "shortName": "bb", 
     "longName": "bb", 
     "pId": "pId2", 
     "featured": true, 
     "pLog": "url.here", 
     "incentivation": "eu", 
     "details": { 
      "teaserImage": "image.url", 
      "description": "desc here", 
      "jumpToShopURL": "nurl", 
      "jumpToShopButton": "zubay", 
      "terms": [{ 
       "headline": "Wichtig", 
       "body": "bodyline" 
      }] 
     } 
    }, { 
     "shortName": "one short name", 
     "longName": "bkp", 
     "pId": "pId1", 
     "featured": true, 
     "pLo": "some.pLo", 
     "incentivation": "1p", 
     "details": { 
      "teaserImage": "some.url", 
      "description": "desc", 
      "jumpToShopURL": "short url", 
      "jumpToShopButton": "Zuay", 
      "terms": [{ 
       "headline": "Wichtig", 
       "body": "bodyhere" 
      }] 
     } 
    }] 
} 

Si Ich dachte, speichern alle „pId“ des ersten eine in einer Liste (oder einem Array) und dann iteriere über diese Liste und überprüfe nach jeder, ob der pId in der neuen existiert. Also habe ich das versucht, aber es funktioniert nicht ..

Könnte mir jemand dabei helfen? Ich habe es ein bisschen versucht und dann festgestellt, dass ich zu viele Schwierigkeiten habe, die pIds in einer Liste oder einem Array gespeichert zu bekommen.

Hat also jemand eine Idee?

import java.io.*; 
import org.json.*; 

public class MainDriver { 

    public static void main(String[] args) throws JSONException { 


     String jsonData = readFile("C:\\Users\\kbelkhiria\\Desktop\\Karim_JSON\\alt.json"); 
     JSONObject jobj = new JSONObject(jsonData); 
     JSONArray jarr = new JSONArray(jobj.getJSONArray("pList").toString()); 

     for(int i = 0; i < jarr.length(); i++) 
      System.out.println("id: " + jarr.getString(i)); 


    } 

    public static String readFile(String filename) { 
     String result = ""; 
     try { 
      BufferedReader br = new BufferedReader(new FileReader(filename)); 
      StringBuilder sb = new StringBuilder(); 
      String line = br.readLine(); 
      while (line != null) { 
       sb.append(line); 
       line = br.readLine(); 
      } 
      result = sb.toString(); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
     return result; 
    } 


} 
+0

Woher wissen Sie, ob das Element in beiden Listen ist? Was sollte der Vergleichsknoten sein? – dambros

+0

pId ist einzigartig .. so pId sollte der Vergleichsknoten – ZelelB

Antwort

0

Für die zweite Form, haben Sie eine JSONObject, aber es enthält einige Fehler. Bitte repariere sie, oder benutze wieder das 1. Formular.

SOLUTION

ich einige Fehler in der zweiten Datei gefunden, so schlage ich folgende Änderungen:

  • Änderung "jumpToShopURL": nurl",-"jumpToShopURL": null,

  • am Ende "description": "desc" ein Komma hinzufügen

  • ein Komma am Ende Für den Code "jumpToShopURL": "short url"

hinzufügen, können Sie die folgenden Zeilen verwenden können:

/*first file*/ 
    String jsonData = readFile("C:\\Users\\kbelkhiria\\Desktop\\Karim_JSON\\alt.json"); 
    JSONArray jarr = new JSONArray(jsonData); 

    /*array of first file's ids*/ 
    ArrayList<String> srcArray = new ArrayList<>(); 

    for(int i = 0; i < jarr.length(); i++) { 
     srcArray.add(jarr.getJSONObject(i).getString("pId")); 
    } 

    /*second file*/ 

    // second form in a seperate file 
    JSONObject obj = new JSONObject(readFile("C:\\Users\\kbelkhiria\\Desktop\\Karim_JSON\\alt2.json")); 
    JSONArray arr = obj.getJSONArray("pList"); 

    /*array of second file's ids*/ 
    ArrayList<String> dstArray = new ArrayList<>(); 

    for(int i = 0; i < arr.length(); i++) { 
     dstArray.add(jarr.getJSONObject(i).getString("pId")); 
    } 

    for (String string : srcArray) { 
     if (dstArray.indexOf(string)==-1) 
      System.out.println(string + " is missing in the second file"); 
    } 
+0

korrigiere ich den zweiten JSON bereits auf meiner Bearbeitung. – dambros

+1

So kann die obige Lösung perfekt laufen. –

0

Zum Glück für Dich gibt es bereits entwickelten Bibliotheken jeden JSON-String zu analysieren, wie die eigenen, Sie zur Verfügung gestellt. Eines der beliebtesten ist org.json

diese verwenden Sie Code ähnlich wie diese schreiben kann:

import org.json.*; 

String myString = ".." // The String representation you provided 
JSONObject obj = new JSONObject(myString); 
JSONArray arr = obj.getJSONArray("pList"); 

Eine weitere beliebte Bibliothek für die gleiche Aufgabe ist GSON

+0

sein Dank Pilu, aber es wirft eine Ausnahme und funktioniert nicht .. – ZelelB

+0

können Sie mir sagen, welche Ausnahme es ist? Leider kann ich mich im Moment nicht zusammensetzen, aber es könnte mir etwas Einfaches sein.Nebenbei habe ich den falschen Variablennamen für das Array verwendet, überprüfe meine Bearbeitung. – pilu

0

Eine mögliche Lösung mit Jackson ist folgende:

private static final String JSON1 = // first json; 

private static final String JSON2 = //second json; 

public static void main(String[] args) throws IOException { 
    ObjectMapper mapper = new ObjectMapper(); 
    List<LinkedHashMap> list1 = Arrays.asList(mapper.readValue(JSON1, LinkedHashMap[].class)); 
    List<LinkedHashMap> list2 = Arrays.asList(mapper.readValue(mapper.readTree(JSON2).get("pList").toString(), LinkedHashMap[].class)); 
    List<LinkedHashMap> missingItens = new ArrayList<>(); 
    for (LinkedHashMap o1 : list1) { 
     if (!objectExistsInList(o1.get("pId").toString(), list2)) { 
      missingItens.add(o1); 
     } 
    } 
} 

private static boolean objectExistsInList(String pIdValue, List<LinkedHashMap> objs) { 
    for (LinkedHashMap map : objs) { 
     if (map.containsValue(pIdValue)) { 
      return true; 
     } 
    } 
    return false; 
} 

Bitte beachten Sie, dass dies eine sehr spezifische Implementierung für die gegebenen JSONs ist.