解析JSON文件并迭代特定参数

时间:2016-04-11 14:18:18

标签: java json parsing iteration

我要检查第二个文件中缺少第一个文件的哪些元素。

这是第一个的形式:

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

]

这是第二个形式:

    {
    "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我想在List(或数组)中保存第一个的所有“pId”,然后迭代该列表并检查每个pId是否存在于新列表中。 所以我尝试了这个,但它不起作用..

有人可以帮我吗?我尝试了一下,然后发现我有太多困难,将pId保存在列表或数组中。

有人有想法吗?

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


} 

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

对于第二种形式,您有一个JSONObject,但它包含一些错误。请修理它们,或再次使用第一个表格。

<强>解

我在第二个文件中发现了一些错误,因此我建议进行以下编辑:

  • "jumpToShopURL": nurl",更改为"jumpToShopURL": null,

  • "description": "desc"

  • 末尾添加逗号
  • "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");
    }

答案 2 :(得分:0)

使用Jackson的一种可能解决方案如下:

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的一个非常具体的实现。