2014-09-17 5 views
0

Я ищу способ обработки информации, которую я получаю в файле JSON. Этот файл должен постоянно меняться (другие люди и программы собираются получить к нему доступ), так что в данный момент было бы как в этом примере:Лучший способ обработки информации JSON

{ 
    "activities": [ 
    { 
     "name": "do my homework", 
     "status": "not yet done", 
     "important": true 
    }, 
    { 
     "name": "wash the dishes", 
     "status": "not yet done", 
     "important": true 
    }, 
    { 
     "name": "play videogames", 
     "status": "done", 
     "important": false 
    }, 
    { 
     "name": "take a shower", 
     "status": "done", 
     "important": true 
    } 
    ] 
} 

И через 15 минут (как раз, чтобы сказать такое количество времени) это было бы как этот

{ 
    "activities": [ 
    { 
     "name": "do my homework", 
     "status": "done", //NOTICE THIS ACTIVITY WAS DONE 
     "important": true 
    }, 
    { 
     "name": "wash the dishes", 
     "status": "not yet done", 
     "important": false //NOTICE THIS HAS CHANGED ITS IMPORTANCE 
    }, 
    { 
     "name": "play videogames", 
     "status": "done", 
     "important": false 
    }, 
    { 
     "name": "take a shower", 
     "status": "done", 
     "important": true 
    }, 
    { //NOTICE I'VE ADDED A NEW ACTIVITY 
     "name": "take another shower", 
     "status": "not yet done", 
     "important": false 
    } 
    ] 
} 

то, что я хочу знать, как обращаться с этими изменениями в Java (по крайней мере, идея), которые могли бы помочь мне, чтобы обнаружить эти изменения и обрабатывать их.

Я думал о создании двух arraylists (doneActivities и notYetDoneActivities), и каждые 10 минут вызывают json-файл и проверяют, были ли изменения, и, вероятно, переключали объекты между этими arraylists (звучит нормально, но я не знаю, как можно Я делаю это).

Или я мог бы даже использовать базу данных mysql, но я думаю, что это могло бы еще более усложнить мой код, и я стараюсь держать его как можно проще.

уведомление, что моя деятельность класса, как это:

public class Activity { 
    private String name; 
    private boolean done; 
    private boolean important; 
    //Getters and setters 
} 

Любые предложения будут очень благодарны.

+0

вы можете использовать nio для обнаружения изменений файловой системы. Есть ли уверенность в том, что другие процессы не будут удалять элементы из файла? если нет, может быть трудно обнаружить remove + insert vs updates – Andreas

+0

Это звучит как работа для JSON Patch и, возможно, Jiff. – chrylis

+0

Простейшим подходом было бы получить код, который генерирует файл для вставки значения «changeDate»: 1410990011', которое вы могли бы сравнивать с интервалом до последнего значения. Если дата изменилась, измените структуру и обработайте изменения. Дата изменения также может быть добавлена ​​к каждому элементу массива, поэтому вы можете легко определить конкретные изменения. –

ответ

0

Во-первых, вам придется использовать что-то Маршаллу/маршализацию вашего JSON в Java, я рекомендую GSON, вот ссылка на учебник: https://sites.google.com/site/gson/gson-user-guide

Вы будете использовать someline так:

Activityies fullObject = gson.fromJson(json, Activities.class); 

Где она содержит список деятельности: List<Activity>

Тогда я рекомендовал бы перезаписать метод toString сравнить л проще, но вы можете реализовать определенную логику для сравнения, если ваш список differe нт.

3

Вам нужно поле идентификации - то, что уникально для каждого действия, так что вы всегда можете отличить те, которые вы уже обработали, от любых новых. Вы не упомянули, как генерируются данные json, но если есть база данных, то, вероятно, уже есть идентификатор, который вы можете включить в json.

public class Activity { 
    private long id; 
    private String name; 
    private boolean done; 
    private boolean important; 
    //Getters and setters 

    @Override 
    public boolean equals(Object o) { 
    if (o instanceof Activity) { 
     Activity other = (Activity) o; 
     return this.getId() == other.getId(); 
    } 
    return false; 
    } 
} 

Метод equals позволит вам хранить ваши действия в наборе, например. HashSet

+0

Мне нравится идея поля идентичности. Поскольку другие процессы могут создавать новые действия, возможно, следует использовать случайную uuid или другую строку с низкой скоростью столкновений. – Andreas

+0

Мне тоже нравится идея, и я могу получить идентификатор каждого вида деятельности.Таким образом, по id я могу сравнить их (просто получить доступ к «сделанному» полю) и, возможно, стереть активность от арифметика notYetDone, ищущего идентификатор, и добавить эту активность к Done arraylist :) GOOD ANSWER мой друг ... Но я не понимаете, что метод «equals» переопределяет ... вы уверены, что его нужно сравнивать по id? или, может быть, я могу сравнить поле «done» (если какое-либо действие меняется, то его идентификатор не должен меняться, но его «сделанное» или «важное» поле должно измениться) – Mgustavoxd1

Смежные вопросы