Вы можете использовать библиотеки Jackson для привязки JSON String к экземплярам POJO ( Обычный объект Java ). POJO - это просто класс с только частными полями и общедоступными методами getter / setter. Джексон собирается пересечь методы (используя отражение) и отображает объект JSON в экземпляр POJO, поскольку имена полей класса соответствуют именам полей объекта JSON.
В вашем объекте JSON, который на самом деле является составным объектом, основной объект состоит из двух под-объектов. Итак, наши классы POJO должны иметь одинаковую иерархию. Я назову весь объект JSON как объект страницы. Объект страницы состоит из объекта PageInfo и массива объектов Post.
Итак, мы должны создать три разных класса POJO:
Единственным пакетом, который я использовал, является Jackson ObjectMapper, то, что мы делаем, является обязательными данными ;
com.fasterxml.jackson.databind.ObjectMapper
Необходимые зависимости, файлы jar перечислены ниже:
Вот требуемый код:
package com.levo.jsonex.model;
public class Page {
private PageInfo pageInfo;
private Post[] posts;
public PageInfo getPageInfo() {
return pageInfo;
}
public void setPageInfo(PageInfo pageInfo) {
this.pageInfo = pageInfo;
}
public Post[] getPosts() {
return posts;
}
public void setPosts(Post[] posts) {
this.posts = posts;
}
}
package com.levo.jsonex.model;
public class PageInfo {
private String pageName;
private String pagePic;
public String getPageName() {
return pageName;
}
public void setPageName(String pageName) {
this.pageName = pageName;
}
public String getPagePic() {
return pagePic;
}
public void setPagePic(String pagePic) {
this.pagePic = pagePic;
}
}
package com.levo.jsonex.model;
public class Post {
private String post_id;
private String actor_id;
private String picOfPersonWhoPosted;
private String nameOfPersonWhoPosted;
private String message;
private int likesCount;
private String[] comments;
private int timeOfPost;
public String getPost_id() {
return post_id;
}
public void setPost_id(String post_id) {
this.post_id = post_id;
}
public String getActor_id() {
return actor_id;
}
public void setActor_id(String actor_id) {
this.actor_id = actor_id;
}
public String getPicOfPersonWhoPosted() {
return picOfPersonWhoPosted;
}
public void setPicOfPersonWhoPosted(String picOfPersonWhoPosted) {
this.picOfPersonWhoPosted = picOfPersonWhoPosted;
}
public String getNameOfPersonWhoPosted() {
return nameOfPersonWhoPosted;
}
public void setNameOfPersonWhoPosted(String nameOfPersonWhoPosted) {
this.nameOfPersonWhoPosted = nameOfPersonWhoPosted;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public int getLikesCount() {
return likesCount;
}
public void setLikesCount(int likesCount) {
this.likesCount = likesCount;
}
public String[] getComments() {
return comments;
}
public void setComments(String[] comments) {
this.comments = comments;
}
public int getTimeOfPost() {
return timeOfPost;
}
public void setTimeOfPost(int timeOfPost) {
this.timeOfPost = timeOfPost;
}
}
Я только что скопировал ваш образец JSON в этот файл и поместил его в папку проекта.
{
"pageInfo": {
"pageName": "abc",
"pagePic": "http://example.com/content.jpg"
},
"posts": [
{
"post_id": "123456789012_123456789012",
"actor_id": "1234567890",
"picOfPersonWhoPosted": "http://example.com/photo.jpg",
"nameOfPersonWhoPosted": "Jane Doe",
"message": "Sounds cool. Can't wait to see it!",
"likesCount": "2",
"comments": [],
"timeOfPost": "1234567890"
}
]
}
package com.levo.jsonex;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.levo.jsonex.model.Page;
import com.levo.jsonex.model.PageInfo;
import com.levo.jsonex.model.Post;
public class JSONDemo {
public static void main(String[] args) {
ObjectMapper objectMapper = new ObjectMapper();
try {
Page page = objectMapper.readValue(new File("sampleJSONFile.json"), Page.class);
printParsedObject(page);
} catch (IOException e) {
e.printStackTrace();
}
}
private static void printParsedObject(Page page) {
printPageInfo(page.getPageInfo());
System.out.println();
printPosts(page.getPosts());
}
private static void printPageInfo(PageInfo pageInfo) {
System.out.println("Page Info;");
System.out.println("**********");
System.out.println("\tPage Name : " + pageInfo.getPageName());
System.out.println("\tPage Pic : " + pageInfo.getPagePic());
}
private static void printPosts(Post[] posts) {
System.out.println("Page Posts;");
System.out.println("**********");
for(Post post : posts) {
printPost(post);
}
}
private static void printPost(Post post) {
System.out.println("\tPost Id : " + post.getPost_id());
System.out.println("\tActor Id : " + post.getActor_id());
System.out.println("\tPic Of Person Who Posted : " + post.getPicOfPersonWhoPosted());
System.out.println("\tName Of Person Who Posted : " + post.getNameOfPersonWhoPosted());
System.out.println("\tMessage : " + post.getMessage());
System.out.println("\tLikes Count : " + post.getLikesCount());
System.out.println("\tComments : " + Arrays.toString(post.getComments()));
System.out.println("\tTime Of Post : " + post.getTimeOfPost());
}
}
Page Info;
****(*****
Page Name : abc
Page Pic : http://example.com/content.jpg
Page Posts;
**********
Post Id : 123456789012_123456789012
Actor Id : 1234567890
Pic Of Person Who Posted : http://example.com/photo.jpg
Name Of Person Who Posted : Jane Doe
Message : Sounds cool. Can't wait to see it!
Likes Count : 2
Comments : []
Time Of Post : 1234567890
Давайте сначала рассмотрим ваш последний вопрос, потому что это самое важное для структурирования проектов python. После того, как вы разобрались с тем, как правильно импортировать импорт в ваш проект, остальное становится намного легче справиться.
Главное, чтобы понять, что каталог текущего скрипта автоматически добавляется к запуску в sys.path
. Поэтому, если вы поместите свой скрипт main.py
(то, что вы в настоящее время вызываете SailQt.pyw
) вне вашего пакета в каталоге контейнеров верхнего уровня, это гарантирует, что импорт пакетов будет всегда работать, нет
Итак, минимальная стартовая структура может выглядеть так:
project/
main.py
package/
__init__.py
app.py
mainwindow.py
Теперь, поскольку main.py
должен быть вне ] каталога пакетов python верхнего уровня, он должен содержать только минимальный код кода (достаточно для запуска программы). Учитывая указанную выше структуру, это будет означать не намного больше:
if __name__ == '__main__':
import sys
from package import app
sys.exit(app.run())
Модуль app
будет содержать большую часть фактического кода, необходимого для инициализации программы и настройки gui, что было бы импортируется следующим образом:
from package.mainwindow import MainWindow
, и эта же форма полной инструкции импорта может использоваться из любого места с пакетом. Так, например, с этой несколько более сложной структурой:
project/
main.py
package/
__init__.py
app.py
mainwindow.py
utils.py
dialogs/
search.py
модуль search
мог импортировать функцию из модуля utils
следующим образом:
from package.utils import myfunc
По конкретной проблеме доступа к строке __version__
: для программы PyQt вы можете поместить следующее в начало модуля app
:
QtGui.QApplication.setApplicationName('progname')
QtGui.QApplication.setApplicationVersion('0.1')
, а затем получить доступ к имени / версии позже например:
name = QtGui.qApp.applicationName()
version = QtGui.qApp.applicationVersion()
Другие проблемы с вашей текущей структурой в основном связаны с сохранением разделения между файлами кода и файлами ресурсов.
Во-первых: дерево пакетов должно содержат только файлы кода (т.е. модули python). Файлы ресурсов относятся к директории проекта (то есть вне пакета). Во-вторых: файлы, содержащие генерируемый код из ресурсов (например, pyuic или pyrcc), вероятно, должны идти в отдельный подпакет (это также упрощает удаление вашего средства управления версиями). Это приведет к созданию общей структуры проекта следующим образом:
project/
db/
database.db
designer/
mainwindow.ui
icons/
logo.png
LICENSE
Makefile
resources.qrc
main.py
package/
__init__.py
app.py
mainwindow.py
ui/
__init__.py
mainwindow_ui.py
resources_rc.py
Здесь Makefile
(или эквивалент) отвечает за создание файлов ui / rc, компиляцию модулей python, установку / удаление программы и т. д. Ресурсы, необходимые программе во время выполнения (например, файл базы данных), должны быть установлены в стандартном местоположении, которое ваша программа знает, как найти (например, что-то вроде /usr/share/progname/database.db
в Linux). Во время установки Makefile
также необходимо создать исполняемый сценарий bash (или эквивалент), который знает, где находится ваша программа и как ее запустить. То есть что-то вроде:
#!/bin/sh
exec 'python' '/usr/share/progname/main.py' "$@"
, которое, очевидно, должно быть установлено как /usr/bin/progname
(или что-то еще).
Это может показаться довольно много иметь дело с во-первых, но, конечно, главное преимущество поиска структуры проекта, которая работает хорошо, заключается в том, что вы можете повторно использовать ее для всех будущих проектов (и начать разрабатывать свои собственные шаблоны и инструменты для создания и управления этими проектами).