草庐IT

arrays - 当数据库中不存在该行时,返回空的 json 数组

coder 2023-06-30 原文

我的函数接收到一个 http 请求并发回 json 字符串作为 http 响应。 这是我的代码:

func homePage(res http.ResponseWriter, req *http.Request) {
    type Resp struct {
        Result []map[string]interface{} `json:"result,omitempty"`
        Status string                   `json:"status"`
    }
    type Inputs struct {
        ShopID   string `json:"ShopID"`
        DeviceID string `json:"DeviceID"`
        EmpID    string `json:"EmpID"`
        Token    string `json:"Token"`
        Version  string `json:"Version"`
    }

    var Response Resp
    Response.Status = "failed"

    db, err := sql.Open("mysql", "root:password@tcp(127.0.0.1:3306)/b2b")

    if err != nil {
        panic(err.Error())
    }
    defer db.Close()

    rnd := render.New()
    b, err := ioutil.ReadAll(req.Body)
    defer req.Body.Close()

    if err != nil {
        panic(err.Error())
    }
    // Unmarshal the request body
    var msg Inputs
    err = json.Unmarshal(b, &msg)
    if err != nil {
        panic(err.Error())
    }

    bookingrows, bookingerr := db.Query("SELECT DISTINCT b2b_booking_id,b2b_check_in_report,b2b_vehicle_at_garage,b2b_service_under_progress,b2b_vehicle_ready,b2b_vehicle_delivered FROM b2b_booking_tbl WHERE b2b_flag=0 and b2b_shop_id=?", msg.ShopID)
    if bookingerr != nil {
        panic(bookingerr.Error())
    } else {

        Result := make(map[string]interface{})
        for bookingrows.Next() {
            var bookingid, checkinreported, vehicleingarage, serviceinprogress, vehicleready, vehicledelivered string
            err = bookingrows.Scan(&bookingid, &checkinreported, &vehicleingarage, &serviceinprogress, &vehicleready, &vehicledelivered)
            type Output struct {
                checkins   int `json:"checkins"`
                inprogress int `json:"inprogress"`
                ready      int `json:"ready"`
                completed  int `json:"completed"`
            }
            var output Output
            if err != nil {
                panic(err.Error())
                Response.Status = "failed"
            }
            if vehicledelivered == "1" {
                output.completed = output.completed + 1
            }
            if vehicledelivered == "0" && vehicleready == "1" {
                output.ready = output.ready + 1
            }
            if vehicledelivered == "0" && vehicleready == "0" && serviceinprogress == "1" {
                output.inprogress = output.inprogress + 1
            }
            if vehicledelivered == "0" && vehicleready == "0" && serviceinprogress == "0" && (checkinreported == "1" || vehicleingarage == "1") {
                output.checkins = output.checkins + 1
            }

            values := make([]string, 4)
            val := reflect.ValueOf(output)
            for i := range values {
                //Result[usercolumns[i]] = fmt.Sprintf("%s", v)
                Result[val.Type().Field(i).Tag.Get("json")] = fmt.Sprintf("%v", i)
            }
        }

        Response.Result = append(Response.Result, Result)
        Response.Status = "success"

    }

    res.Header().Set("Content-Type", "application/json")
    rnd.JSON(res, http.StatusOK, Response)
}

当输入值正确并且 Db 中存在相应的行时,我将获得所需的输出。但是当输入错误或查询失败时,我应该只返回“失败”状态,但我的输出包含结果 [],它像这样是空的。

{
    "result": [
        {}
    ],
    "status": "success"
} 

我尝试检查 Result == nil 并仅在 true 时添加数组。但这对我没有帮助。可能是因为该结构不是空的。 我需要一些帮助来找到问题并解决它。

最佳答案

在将其附加到输出之前尝试检查 Result 数组的长度

像这样

if (len(Result) != 0) {
    Response.Result = append(Response.Result, Result)
}

也许您还需要在 if 条件中,在追加语句之前编写 Result := make(map[string]interface{})

关于arrays - 当数据库中不存在该行时,返回空的 json 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49148138/

有关arrays - 当数据库中不存在该行时,返回空的 json 数组的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby - 在 Ruby 中实现 `call_user_func_array` - 2

    我怎样才能完成http://php.net/manual/en/function.call-user-func-array.php在ruby中?所以我可以这样做:classAppdeffoo(a,b)putsa+benddefbarargs=[1,2]App.send(:foo,args)#doesn'tworkApp.send(:foo,args[0],args[1])#doeswork,butdoesnotscaleendend 最佳答案 尝试分解数组App.send(:foo,*args)

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. Ruby Koans about_array_assignment - 非平行与平行分配歧视 - 2

    通过ruby​​koans.com,我在about_array_assignment.rb中遇到了这两段代码你怎么知道第一个是非并行赋值,第二个是一个变量的并行赋值?在我看来,除了命名差异之外,代码几乎完全相同。4deftest_non_parallel_assignment5names=["John","Smith"]6assert_equal["John","Smith"],names7end45deftest_parallel_assignment_with_one_variable46first_name,=["John","Smith"]47assert_equal'John

  5. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  6. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  7. arrays - 这是 Ruby 中 Array.fill 方法的错误吗? - 2

    这个问题在这里已经有了答案:Arraysmisbehaving(1个回答)关闭6年前。是否应该这样,即我误解了,还是错误?a=Array.new(3,Array.new(3))a[1].fill('g')=>[["g","g","g"],["g","g","g"],["g","g","g"]]它不应该导致:=>[[nil,nil,nil],["g","g","g"],[nil,nil,nil]]

  8. ruby-on-rails - 如何使用 Rack 接收 JSON 对象 - 2

    我有一个非常简单的RubyRack服务器,例如:app=Proc.newdo|env|req=Rack::Request.new(env).paramspreq.inspect[200,{'Content-Type'=>'text/plain'},['Somebody']]endRack::Handler::Thin.run(app,:Port=>4001,:threaded=>true)每当我使用JSON对象向服务器发送POSTHTTP请求时:{"session":{"accountId":String,"callId":String,"from":Object,"headers":

  9. ruby-on-rails - rspec - 如何检查方法是否存在? - 2

    我的模型有defself.empty_building//stuffend我怎样才能对这个现有的进行rspec?,已经尝试过:describe"empty_building"dosubject{Building.new}it{shouldrespond_to:empty_building}endbutgetting:Failure/Error:it{shouldrespond_to:empty_building}expected#torespondto:empty_building 最佳答案 你有一个类方法self.empty_bu

  10. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

随机推荐