Python单元素设置为JSON

2024-10-08 19:28:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一堆变量要转换成JSON对象字符串。其中一些变量是集合。但是如果集合只有一个条目,我就不能让它工作。你知道吗

我已经看了下面的问题,但我不是在处理文字,而是在处理变量。所以这对我真的没什么帮助。
How to pass a list containing a single string in python?

我尝试了以下类来编码数据:

class SetEncoder(json.JSONEncoder):
  def default(self, obj):
    if isinstance(obj, set):
      setLen = len(obj)
      if len(obj) != 1:
        setAsList = list(obj)
      else:
        setAsList = [obj]
      logging.debug("DIAG: IN SetEncoder with obj = %r ; setAsList = %r ; setLen = %s" % (obj, setAsList, setLen))
      return setAsList
    return json.JSONEncoder.default(self, obj)

下面是我的代码来尝试对集合进行编码:

  # following is just to demonstrate the problem; no matter how I try to
  # set the single element set, the code to process it doesn't work;
  # I've tried set(("CAT1")), set(("CAT1",)), set(["CAT1",])
  countriesSet = set(["US", "DE"])
  categoriesSet = set(["CAT1"])

  body = {
    "ownerId": OWNER_ID,
    "countries": countriesSet,
    "categories": categoriesSet
  }
  bodyJson = json.dumps(body, cls=SetEncoder)

这是我的输出:

DEBUG:root:DIAGDIAGDIAG: countriesSet = {'US', 'DE'}, len = 2; categoriesSet = {'CAT1'}, len = 1
DEBUG:root:DIAG: IN SetEncoder with obj = {'US', 'DE'} ; setAsList = ['US', 'DE'] ; setLen = 2
DEBUG:root:DIAG: IN SetEncoder with obj = {'CAT1'} ; setAsList = [{'CAT1'}] ; setLen = 1
ERROR:root:parseXML: Encountered exception - Circular reference detected for destination <Element 'destination' at 0x000002570535B728>

如您所见,单个条目周围有花括号,而工作条目没有

有人有什么想法吗?你知道吗


Tags: toinjsonobjlen条目deroot
1条回答
网友
1楼 · 发布于 2024-10-08 19:28:22

简单地说:

class SetEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, set):
            return list(obj)
        return json.JSONEncoder.default(self, obj)

通过[x],您是在列表中包装您的set对象,而不是“转换”它。(正是此包装的展开导致了循环引用)

回复:讨论

我们要说清楚,这就是我的建议。在任何情况下,我都不会丢失单个元素(list/tuple/set)周围的括号: 导入json

class SetEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, set):
            return list(obj)
        return json.JSONEncoder.default(self, obj)


objs = {
    'one_element_list_int': [1],
    'one_element_list_tup': ("foo",),
    'one_element_list_set': {10},
    'two_element_list_int': [2, 3],
    'two_element_list_tup': ("bar", "baz"),
    'two_element_list_set': {11,12},
}

for (k,v) in objs.items():
    dump = json.dumps(v, cls=SetEncoder)
    print(k+": ", v, "->", dump)

产生

one_element_list_int:  [1] -> [1]
one_element_list_tup:  ('foo',) -> ["foo"]
one_element_list_set:  {10} -> [10]
two_element_list_int:  [2, 3] -> [2, 3]
two_element_list_tup:  ('bar', 'baz') -> ["bar", "baz"]
two_element_list_set:  {11, 12} -> [11, 12]

相关问题 更多 >

    热门问题