在更新Redux状态之前规范化服务器的JSON响应

时间:2017-08-24 17:24:54

标签: python django redux json-deserialization

这是我首选的范例(可能是每个人),服务器对于序列化其JSON响应仍然不感兴趣,因为它并不关心哪个客户端正在使用它。换句话说,我的django JSON有效载荷按照标准用蛇案编写。在此之前可以更新我的Redux存储中的状态,按照Javascript标准,密钥应该映射到camel case。 python开发人员不相信这是值得的,他有一个公平的观点,但是如果没有遵循惯例就感觉不对。

应如何处理?

2 个答案:

答案 0 :(得分:3)

我通常拥有的是一个处理所有获取请求的中间件,在那里我可以拦截响应并使用Humps将密钥转换为camelCase。

// fetchMiddleware.js
export default ({ dispatch, getState }) => next => (action) => {
  if (typeof action === 'function') {
    return action(dispatch, getState);
  }

  const { promise, types, ...rest } = action;

  // this middleware expects a promise object in the action,
  // the object contains all configurations to send the request to
  // the server, if no promise is defined then it just ignores this action
  if (!promise) {
    return next(action);
  }

  return fetch(promise.url, promise)
    .then(response => Promise.resolve(humps.camelizeKeys(response)))
    .then(data => dispatch({ type: types[1], data }))
    .catch(error => dispatch({ type: types[2], error }));
}

然后在某个组件或其他任何地方,将按照以下方式调度操作:

store.dispatch({
  types: ['BEFORE_REQUEST', 'REQUEST_SUCCESS', 'REQUEST_FAIL'],
  promise: {
    url: 'some/api.json',
    params: { x, y },
  },
});

我通常有一个实用程序来处理fetch,但这会让你知道如何处理camelCase转换。

答案 1 :(得分:1)

听起来你想要一个特殊的解析器和/或渲染器在驼峰盒和蛇盒之间来回切换。如果您使用的是Django Rest Framework,则可以使用JSONRenderer创建新的子类,例如CamelCaseJSONRenderer,以便它自动来回切换。

在base,你需要实现一个如下所示的函数:

def to_camelcase(string, lower_first_char=True):
    """Takes snakecase string and converts to camelcase."""
    camelize = ''.join(char.capitalize() for char in word.split('_'))
    result = (camelize[0].lower() + result[1:]) if lower_first else camelize
    return result

def parse(data, lower_first=True):
    """Camelcase the keys of a dictionary or items of a list."""
    if isinstance(data, dict):
        result = {to_camelcase(k): parse(v) for k, v in data.items()}
    elif isinstance(data, list):
        result = [parse(item) for item in data]
    else:
        result = data
    return result

然后,您可以在自定义CamelCaseJSONRenderer中运行这些功能,并将渲染器添加到您的视图中。这样所有python对象都是背面的蛇形和你的javascript中的camelcase。