Python中的JavaScript JSON恢复器

1tu0hz3e  于 2022-12-05  发布在  Python
关注(0)|答案(3)|浏览(141)

我在将JavaScript代码段转换为Python时遇到问题。
JavaScript代码如下所示:

const reviver = (_key, value) => {
  try {
    return JSON.parse(value, reviver);
  } catch {
    if(typeof value === 'string') {
      const semiValues = value.split(';');
      if(semiValues.length > 1) {
        return stringToObject(JSON.stringify(semiValues));
      }
      const commaValues = value.split(',');
      if(commaValues.length > 1) {
        return stringToObject(JSON.stringify(commaValues));
      }
    }
    const int = Number(value);
    if(value.length && !isNaN(int)) {
      return int;
    }
    return value;
  }
};

const stringToObject = (str) => {
  const formatted = str.replace(/"{/g, '{').replace(/}"/g, '}').replace(/"\[/g, '[').replace(/\]"/g, ']').replace(/\\"/g, '"');
  return JSON.parse(formatted, reviver);
};

该功能的目标是:

  • 解析数字字符串值
  • 使用以下规则解析json字符串值
  • 字符串值(如"499,504;554,634")应解析为[(499, 504), (554, 634)]

我试过使用JSONDecoder。

import json

def object_hook(value):
    try:
        return json.loads(value)
    except:
        if(isinstance(value, str)):
            semiValues = value.split(';')
            if(len(semiValues) > 1):
                return parse_response(json.dumps(semiValues))
            commaValues = value.split(',')
            if(commaValues.length > 1):
                return parse_response(json.dumps(commaValues))
        try:
            return float(value)
        except ValueError:
            return value

def parse_response(data: str):
    formatted = data.replace("\"{", "{").replace("}\"", '}').replace("\"[", '[').replace("]\"", ']').replace("\\\"", "\"")
    return json.load(formatted, object_hook=object_hook)
lmvvr0a8

lmvvr0a81#

Python代码看起来是正确的,但也有一些问题。首先,在if语句中使用了commaValues .length而不是len(commaValues)来检查commaValues的长度是否大于1。其次,json.load()需要一个类似文件的对象作为它的第一个参数。不是字符串。可以使用json.loads()来解析JSON字符串。
下面是我用Python编写代码的方法:

import json

def reviver(key, value):
  try:
    return json.loads(value, reviver=reviver)
  except:
    if isinstance(value, str):
      semiValues = value.split(';')
      if len(semiValues) > 1:
        return stringToObject(json.dumps(semiValues))
      commaValues = value.split(',')
      if len(commaValues) > 1:
        return stringToObject(json.dumps(commaValues))

    try:
      return int(value)
    except ValueError:
      return value

def stringToObject(str):
  formatted = str.replace('"{', '{').replace('}"', '}').replace('"[', '[').replace(']"', ']').replace('\\"', '"')
  return json.loads(formatted, reviver=reviver)

注意,我还修改了try语句,尝试将字符串转换为数字,使用int()而不是float()将值解析为整数,而不是浮点数。我还修改了函数和变量名,以遵循Python约定,使用小写单词并用下划线分隔(例如,使用string_to_object而不是stringToObject)。

o0lyfsai

o0lyfsai2#

我通过迭代这些值并相应地解析它们来解决我的问题

import json

def parse_value(value):
    if(isinstance(value, str)):
        try:
            return parse_value(json.loads(value))
        except:
            pass
        semi_values = value.split(';')
        if(len(semi_values) > 1):
            return list(map(parse_value, semi_values))
        comma_values = value.split(',')
        if(len(comma_values) > 1):
            return list(map(parse_value, comma_values))
        if(value.replace('.','',1).isdigit()):
            return int(value)
    if(isinstance(value, dict)):
        return {k: parse_value(v) for k, v in value.items()}
    if(isinstance(value, list)):
        return list(map(parse_value, value))
    return value
tct7dpnv

tct7dpnv3#

这段代码对您有效吗?

def reviver(_key, value):
    try:
        return json.loads(value, object_hook=reviver)
    except:
        if type(value) == str:
            semi_values = value.split(';')
            if len(semi_values) > 1:
                return string_to_object(json.dumps(semi_values))
            comma_values = value.split(',')
            if len(comma_values) > 1:
                return string_to_object(json.dumps(comma_values))
        int_val = int(value)
        if len(value) and not isinstance(int_val, int):
            return int_val
        return value

def string_to_object(str):
    formatted = str.replace('"{', '{').replace('}"', '}').replace('"[', '[').replace(']"', ']').replace('\\"', '"')
    return json.loads(formatted, object_hook=reviver)

相关问题