JSON 编码/解码 GTK 枚举

2024-02-04

我必须将自定义 GTK 元素的各种属性保存到文件中以供将来使用,并由于简单的格式和字典嵌套而决定使用 JSON。

许多属性都是 GTK 枚举,例如gtk.PAGE_ORIENTATION_PORTRAIT, gtk.ANCHOR_CENTER and pango.ALIGN_LEFT。它们有一个唯一的名称,可以通过以下方式检索obj.value_name获取有效的 JSON 类型。

目前我的每个元素都有两种方法:to_str()获取 value_name 和from_str()它再次将 str 映射到 enum。我想自动执行此操作,这样我就不会忘记调用这些并稍微清理一下代码。 JSONEncoder 和 JSONDecodr 正是这样做的,或者我是这么想的......

这是 Python 文档中给出的示例,它按预期工作。

import json

class ComplexEncoder(json.JSONEncoder):
    def default(self, obj):
        print "default method called for:", obj
        if isinstance(obj, complex):
            return [obj.real, obj.imag]
        return json.JSONEncoder.default(self, obj)

print json.dumps(2 + 1j, cls=ComplexEncoder)

基于此示例,我添加了 GTK 枚举:

import json
import gtk

ENUMS = [gtk.PAGE_ORIENTATION_PORTRAIT, gtk.PAGE_ORIENTATION_LANDSCAPE]

class GtkEncoder(json.JSONEncoder):
    def default(self, obj):
        print "default method called for:", obj
        if obj in ENUMS:
            return obj.value_name
        return json.JSONEncoder.default(self, obj)

print json.dumps(gtk.PAGE_ORIENTATION_LANDSCAPE, cls=GtkEncoder)

注意添加的 print 语句default方法。在原始示例中,调用此方法没有问题,但在 GTK 示例中则不然。这default方法从未被调用并且它返回<enum GTK_PAGE_ORIENTATION_LANDSCAPE of type GtkPageOrientation>这当然不是有效的 JSON。

那么,有没有一种方法可以自动编码/解码这些枚举,或者我是否坚持使用当前的手动方法?请注意,我要转储的数据结构不是单个值,而是一个或多个字典。


发生观察到的行为是因为值gtk.PAGE_ORIENTATION_LANDSCAPE是一个实例class 'gtk._gtk.PageOrientation'它继承了type 'gobject.GEnum'反过来又继承了type 'int'.

所以你的 GTK 枚举是整数,并且 json 代码假设它可以处理整数,因此不会调用default你的编码器的方法。

不幸的是,当前的 json 实现对于编码子类类型没有那么有帮助,如下所示:-/没有继承和重写使这成为可能(至少我找不到任何解决方案)。检查值的硬编码位置太多isinstance(value, (int, long)).

But you can当然,修补 json 编码器的源代码即可实现您的目标,而无需重新实现整个 json 功能。为此复制文件encoder.py来自 json 库(对我来说这是/usr/lib/python2.7/json/encoder.py)到您的工作目录并修补它。

在函数中_iterencode_list() and _iterencode_dict()(它们是本地函数_make_iterencode())你可以找到类型检查int or long;如果是这样,当前的实现只是调用str(value)。将其更改为encodeInt(value)(在三个地方!)并实现您自己的encodeInt()函数于encoder.py:

def encodeInt(value):
  try:
    return value.value_name
  except:
    return str(value)

然后,在原始代码中,您必须直接导入该修补文件:

import encoder

并且您必须确保不再使用 C 实现,而是使用修补后的代码。 (您会看到,通常使用(更快的)C 实现,而我们修补某些内容的 Python 代码则不是。)要实现此目的,只需在导入后添加:

encoder.c_make_encoder = None

现在可以使用您的修补编码器:

print encoder.JSONEncoder().encode({
  gtk.PAGE_ORIENTATION_PORTRAIT: [
    gtk.PAGE_ORIENTATION_LANDSCAPE
  ],
  gtk.PAGE_ORIENTATION_LANDSCAPE: gtk.PAGE_ORIENTATION_PORTRAIT })

prints:

{"GTK_PAGE_ORIENTATION_PORTRAIT": [GTK_PAGE_ORIENTATION_LANDSCAPE], "GTK_PAGE_ORIENTATION_LANDSCAPE": GTK_PAGE_ORIENTATION_PORTRAIT}

请注意,Json 字典键始终必须是字符串。这就是为什么您的值在用作键时会得到双引号。但这也是命运的常态ints — 当用作密钥时 — 共享。它们也会被字符串化。

你可以看看http://pastebin.com/2HAtN9E8 http://pastebin.com/2HAtN9E8查看所有来源。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JSON 编码/解码 GTK 枚举 的相关文章

随机推荐

  • 预构建事件后忽略 App.Config

    我有一个包含多个项目和多个开发人员的解决方案 每个开发人员都有自己的环境 当然 为了管理每个环境之间的连接字符串 我为每个环境创建了几个 app config 文件 app config dev app config qa 等 预构建事件只
  • Google Maps API v3:从数组添加标记不起作用

    首先感谢您考虑回答这个问题 非常感谢 我使用以下代码创建了一个地图 效果非常好 function initialize var mapOptions zoom 5 center new google maps LatLng 48 160 6
  • 模板不存在 Django

    我的 Django 模板位置列出为 python Lib site packages django contrib auth templates 在我看来我有 return render to response hello html nam
  • 通过代码 tradeview/pine 脚本隐藏图表、数量和信号标签上的交易

    每次我更新策略代码时 样式都会重置 这意味着 图表上的交易 信号标签 Quantity 被重置为显示 有没有办法覆盖该行为 以便我可以隐藏 图表上的交易 非常感谢您对这个看似微不足道的问题的帮助 不 默认情况下没有禁用它们的功能 前段时间我
  • MySQL 索引上的正则表达式

    我有查询在 where 子句中有多个正则表达式 where 子句中包含的列已被索引 但查询没有使用索引 MySql 正则表达式是否会导致使用索引 如果没有 解决方法是什么 不可以 正则表达式查找不能使用索引 如果您应用正则表达式的对象是索引
  • vectorize_sequences 的标准实现

    In 弗朗索瓦 肖莱 https fchollet com s 使用 Python 进行深度学习 https www manning com books deep learning with python 出现这个函数 def vector
  • 如何从类库中读取“System.ServiceModel”配置节组?

    有没有办法访问 System ServiceModel 客户端配置 即基于类 dll 项目中的app config ConfigurationManager GetSection string 允许您从执行应用程序的 app config
  • 空格键:如何在 if 语句中使用 and/or

    我有以下代码 div class div 如何在空格键模板的 if 条件中使用 AND OR 空格键无法处理逻辑表达式 因此您需要创建一个助手来为您处理计算 其实你可以实现and具有嵌套 if 的功能如下 if condition1 if
  • 如何在 Wix 安装程序中添加 url [LINK]

    我正在使用 Wix 工具集版本 3 7 我想在欢迎屏幕描述中添加一些指向产品网站的链接 如何实现这一目标 我认为你可以通过做这样的事情来做到这一点
  • 在交叉编译时我必须对 C++ 库做什么?

    这是我的配置的编译器部分 IF UNIX Compiler flags specify the cross compiler SET CMAKE C COMPILER home username projects buildroot out
  • 使用 fxml 文件设置anchorPane的内容

    我使用手风琴控件 根据标题窗格 我需要将 fxml 文件加载到锚窗格中 所以我有两部分 一部分用于手风琴 另一部分用于anchorPane 根据点击显示内容 FXML private StackPane tmpPane FXML priva
  • Gradle dagger lint:按包忽略

    我使用 Gradle 创建了一个 Android 项目 我添加了一个 Dagger 库 dependencies compile com squareup dagger dagger compiler 1 2 1 compile com s
  • 如何将react数据发布到express

    我正在尝试创建一个图书应用程序 我在前端做出反应 在后端使用节点js 当我尝试在后端创建时 它说无法 POST create 我该怎么办 该文件夹分为前端和后端 我正在使用 axios 我是 React js 的新手 请帮忙 我如何将 Re
  • 最高效的 CSS 选择器:标题标签、类还是 ID? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在不存储一副牌的情况下实现荷官类?

    Question 即使只有 52 张牌 permutationIndex我在其中描述的地方说明部分 将是一个巨大的数字 它是其中之一的数字52 需要29个字节来存储 Thus 我不知道一个简单的方法来计算permutationIndex一个
  • 作为 Android .apk 一部分的 Pdf 文件

    我必须构建一个 Android 应用程序来显示 pdf 文件列表 这些 pdf 文件应该受到保护 换句话说 应用程序的用户不应该能够通过任何方式 复制 剪切 打印 等 获取 pdf 内容的副本 我现在的问题是 我应该如何将 pdf 文件的内
  • 使用正则表达式标记字符串中的文本但排除链接

    我有一个文本 我希望当用户搜索某个术语时 通过用标记标签包裹该术语来突出显示该术语 javascript 来包装匹配项 var sampleText window document getElementById test innerHTML
  • java - 使用基类实例在派生类中访问受保护的成员

    我在派生类中创建了基类的实例并尝试访问受保护的成员 我可以直接访问派生类中的受保护成员 而无需实例化基类 基类 package com core public class MyCollection protected Integer int
  • 尝试在 Windows Phone 开发中心更新 XAP 时出错

    我正在尝试提交 Windows Phone 应用程序的更新 但是当我单击 更新应用程序 并选择相应的 xap 文件时 出现以下错误消息 ScriptObject InvokeFailed 参数 调试资源字符串不可用 通常 键和参数提供了足够
  • JSON 编码/解码 GTK 枚举

    我必须将自定义 GTK 元素的各种属性保存到文件中以供将来使用 并由于简单的格式和字典嵌套而决定使用 JSON 许多属性都是 GTK 枚举 例如gtk PAGE ORIENTATION PORTRAIT gtk ANCHOR CENTER