Azure函数:返回json对象

时间:2019-06-13 18:24:13

标签: azure-functions azure-functions-core-tools

import logging
import azure.functions as func

def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    name = {"test":"jjj"}
    return func.HttpResponse(name)

以上是我使用python预览的azure函数(V2)。 如果我回来

func.HttpResponse(f"{name}") 

它可以工作,但是如果我返回dict对象,它就不能工作。 显示的错误是

Exception: TypeError: reponse is expected to be either of str, bytes, or bytearray, got dict

请帮助。

5 个答案:

答案 0 :(得分:10)

您需要使用内置的json库将字典转换为json字符串。 https://docs.python.org/3/library/json.html#json.dumps

然后,您可以将函数的模仿类型(Content-Type)设置为application/json。默认情况下,Azure函数HttpResponse返回text/plain内容类型。

import json
import logging
import azure.functions as func

def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    name = {"test":"jjj"}
    return func.HttpResponse(
        json.dumps(name),
        mimetype="application/json",
    )

答案 1 :(得分:7)

更好的方式:

func.HttpResponse.mimetype = 'application/json'
func.HttpResponse.charset = 'utf-8'

return func.HttpResponse(json_object)

答案 2 :(得分:1)

首先,我不是Python专家。只是想让您知道问题的全部。

因此在Azure函数上,如果您查看,则将看到其返回类型为IActionResult,如果您decompile,则会看到

IActionResult IConvertToActionResult.Convert()
    {
      ActionResult result = this.Result;
      if (result != null)
        return (IActionResult) result;
      return (IActionResult) new ObjectResult((object) this.Value)
      {
        DeclaredType = typeof (TValue)
      };
    }

因此,它期望您提供一个对象,而不是Dictionary或List或任何类型的泛型类型。但是,如果将其转换为OkObjectResult之类的对象,则不会遇到编译错误。请参见下面的示例:

            IDictionary<int, string> MyDictionary = new Dictionary<int, string>();
            MyDictionary.Add(new KeyValuePair<int, string>(1, "One"));
            MyDictionary.Add(new KeyValuePair<int, string>(2, "Two"));
            ////As we have to return IAction Type So converting to IAction Class Using OkObjectResult We Even Can Use OkResult
            return new MyDictionary;

以上代码会遇到编译错误。因为它不直接支持Dictionary或List或任何泛型。请参见以下屏幕截图:

enter image description here

查看错误内容:

enter image description here

但是,如果将Dictionary或List或任何泛型转换为对象类型,则可以肯定地解决您的问题。参见以下示例:

               IDictionary<int, string> MyDictionary = new Dictionary<int, string>();
                MyDictionary.Add(new KeyValuePair<int, string>(1, "One"));
                MyDictionary.Add(new KeyValuePair<int, string>(2, "Two"));

                //So have converted MyDictionary into Object type that the compiler deserve. And no compile error encountered.
                return new OkObjectResult(MyDictionary);

请参见以下屏幕截图:

enter image description here

注意::如果您尝试将func.HttpResponse(name)解析为一个对象,然后最终返回,则问题应该得到解决。因此,您可以做的是尝试在项目import json中添加对此包的引用,然后尝试以下代码:

import json


name = {"test":"jjj"}

print(json.dumps(name))

答案 3 :(得分:0)

执行此操作的正确方法是:

return func.HttpResponse(
   body=name,
   status_code=200
)

有关HttpResponse类的更多信息,请参见docs

答案 4 :(得分:0)

试试这个

 import json

     return func.HttpResponse (
        json.dumps({
        'lat': lat,
        'lon': lon

        }) 
     )