def __init__(self, data, parent = None):
     super(JsonModel, self).__init__(parent)
     self.__root_ = JsonItem([u"Параметр", u"Полученное значение"])
     self.setupModelData(data, self.__root_)
class JsonModel(QtCore.QAbstractItemModel):
    def __init__(self, data, parent = None):
        super(JsonModel, self).__init__(parent)
        self.__root_ = JsonItem([u"Параметр", u"Полученное значение"])
        self.setupModelData(data, self.__root_)

    def columnCount(self, parent):
        if parent.isValid():
            return parent.internalPointer().columnCount()
        else:
            return self.__root_.columnCount()

    def data(self, index, role):
        if not index.isValid():
            return None

        if role != QtCore.Qt.DisplayRole:
            return None

        item = index.internalPointer()

        return item.data(index.column())

    def flags(self, index):
        if not index.isValid():
            return QtCore.Qt.NoItemFlags

        return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable

    def headerData(self, section, orientation, role):
        if orientation == QtCore.Qt.Horizontal and role == QtCore.Qt.DisplayRole:
            return self.__root_.data(section)

        return None

    def index(self, row, column, parent):
        if not self.hasIndex(row, column, parent):
            return QtCore.QModelIndex()

        if not parent.isValid():
            parentItem = self.__root_
        else:
            parentItem = parent.internalPointer()

        childItem = parentItem.child(row)
        if childItem:
            return self.createIndex(row, column, childItem)
        else:
            return QtCore.QModelIndex()

    def parent(self, index):
        if not index.isValid():
            return QtCore.QModelIndex()

        childItem = index.internalPointer()
        parentItem = childItem.parent()

        if parentItem == self.__root_:
            return QtCore.QModelIndex()

        return self.createIndex(parentItem.row(), 0, parentItem)

    def rowCount(self, parent):
        if parent.column() > 0:
            return 0
        if not parent.isValid():
            parentItem = self.__root_
        else:
            parentItem = parent.internalPointer()
        return parentItem.childCount()

    def setupModelData(self, objects, parent):
        if isinstance(objects, list):
            if (len(objects) == 1):
                self.setupModelData(objects[0], parent)
                return
            for index in range(len(objects)):
                obj = objects[index]
                if isinstance(obj, list) or isinstance(obj, dict):
                    label = "#%d" % (index + 1)
                    if isinstance(obj, dict) and obj.has_key(u"User"):
                        label = obj["User"]
                    item = JsonItem([label, u""], parent)
                    parent.appendChild(item)
                    self.setupModelData(obj, item)
                else:
                    parent.appendChild(JsonItem([obj, u""], parent))
        else:
            for key in objects:
                obj = objects[key]
                if isinstance(obj, list) or isinstance(obj, dict):
                    item = JsonItem([key, u""], parent)
                    parent.appendChild(item)
                    self.setupModelData(obj, item)
                else:
                    parent.appendChild(JsonItem([key, obj], parent))