2016-04-11 17 views
0

第1ファイルのどの要素が第2ファイルで欠落しているかをチェックします。ここでJSONファイルを解析して特定のパラメータを繰り返します

は、最初の1の形式である:

[ 
    { 
     "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" 
     } 
    } 

] 

、ここでは第二1の形式である:

{ 
    "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の私が最初にすべての「PID」を保存するために考えられ1つはList(または配列)内にあり、そのリストを反復し、新しいものにpIdが存在するかどうかを調べます。 だから私はこれを試みたが、それは動作していません..

誰も私を助けることができますか?私はちょっと試してみたところ、リストや配列に保存されたpIdsを得るには、あまりにも多くの困難があることがわかった。

誰かがアイデアを持っていますか?

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

要素が両方のリストにあるかどうかをどのように知っていますか? comparsionノードは何が必要ですか? – dambros

+0

pIdはユニークです。したがって、pIdは比較ノードである必要があります – ZelelB

答えて

0

ですJSONObjectですが、いくつかのエラーがあります。それらを修正するか、または最初のフォームを再度使用してください。

  • 変更"jumpToShopURL": nurl",

  • "jumpToShopURL": null,"description": "desc"の最後にカンマを追加します。私は2番目のファイルに多少の誤差はので、私は次の編集を示唆してい

    SOLUTION

  • コードについて"jumpToShopURL": "short url"

の最後にカンマを追加し、次の行を使用することができます。ジャクソンを使用して

/*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

私はすでに編集中の2番目のJSONを修正します。 – dambros

+1

したがって、上記のソリューションは完全に実行できます。 –

0

幸いなことに、あなたの提供するようなJSON文字列を解析するためのライブラリがすでに開発されています。最も人気のあるの一つは、あなたがこのようなコード記述することができ、これを使用して org.json

です:

import org.json.*; 

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

同じタスクのためのもう一つの人気のライブラリをあなたが持っている、第二の形式についてGSON

+0

ありがとうございますpiluが例外をスローしていて動作していません.. – ZelelB

+0

例外は何ですか?残念ながら私は現時点で自分自身をコンパイルできませんが、それは私には何か簡単かもしれません。ところで、私は配列に間違った変数名を使用して、私の編集を確認してください。 – pilu

0

一つの可能​​な解決策は、以下の通りである。

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

これは指定されたJSONの非常に具体的な実装であることに注意してください。

関連する問題