簡體   English   中英

JavaScript JSON Python 中的復活劑

[英]JavaScript JSON reviver in Python

我在將我的 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);
};

function 的目標是:

  • 解析作為數字的字符串值
  • 使用這些規則解析 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)

我通過遍歷值並相應地解析它們來解決我的問題

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM