import jsondef transform_name(id): if id < 8000: return "flaw_type_" + str(id) else: return ""def transform_nickName(show, parent_attributes, siblings): siblings_show = "" for sibling in siblings: if sibling != parent_attributes and "show" in sibling: siblings_show += sibling["show"] + "_" return siblings_show + showdef transform_object(obj, attributes): result = {} if "id" in obj and obj["id"] and obj["id"] < 8000: result["name"] = transform_name(obj["id"]) result["nickName"] = transform_nickName(obj["show"], attributes, obj["Attributes"]) if "Properties" in obj: result["Properties"] = [] for property in obj["Properties"]: result["Properties"].append(transform_object(property, obj["Attributes"])) else: return None return resultdef transform_params_to_target(): with open("params.json", "r") as f: params = json.load(f) target = [] for obj in params: transformed_obj = transform_object(obj, params) if transformed_obj: target.append(transformed_obj) with open("target.json", "w") as f: json.dump(target, f, indent=4)if __name__ == "__main__": transform_params_to_target() 这一行代码中,输出的target.json并没有数据里面
时间: 2023-07-14 21:12:59 浏览: 136
这段代码是一个Python脚本,用于将一个名为"params.json"的JSON文件进行转换并生成一个新的JSON文件"target.json"。转换规则是将"params.json"中的每个对象(object)根据其"id"属性进行转换,如果"id"属性小于8000,则将其转换为"name"属性和"nickName"属性,其中"name"属性的值为"flaw_type_"加上"id"属性的值,"nickName"属性的值根据"show"属性、父对象的属性和兄弟对象的属性进行转换。如果"id"属性大于等于8000,则将该对象忽略。如果该对象包含"Properties"属性,则递归地对其进行转换。最后,将所有转换后的对象放入一个名为"target"的列表中,并将该列表转换为JSON格式的字符串并写入到"target.json"文件中。
如果输出的"target.json"文件为空,则可能是因为"params.json"文件为空,或者其中的每个对象的"id"属性均大于等于8000,导致所有对象都被忽略了。
相关问题
改进代码func TracingList(ctx *gin.Context) { resp := models.Response{ Code: 0, Msg: "success", } t, _ := strconv.Atoi(ctx.Query("t")) label, _ := strconv.Atoi(ctx.Query("label")) page, _ := strconv.Atoi(ctx.DefaultQuery("page", "1")) pageSize, _ := strconv.Atoi(ctx.DefaultQuery("pageSize", "10")) code := ctx.Query("code") //设施类型 if len(code) == 0 { resp.Code = 400 resp.Msg = "请输入code值" ctx.JSON(400, resp) return } type Total struct { gorm.Model Type int16 Source int16 Explanation string Label int16 FacilityID string } db := common.DB.Session(&gorm.Session{}) if t < 0 || t > 5 { var req interface{} switch t { case 0: req = []*Total{} case 1: req = []*models.Flaw{} case 2: req = []*models.Issue{} case 3: req = []*models.Record{} case 4: req = []*models.Quality{} case 5: req = []*models.Inspection{} } //查询并分页 if t < 1 || t > 5 { res := db.Scopes(models.Paginate(page, pageSize)).Where("facility_id=?", code).Find(&req) if res.RowsAffected == 0 { resp.Code = 400 resp.Msg = "记录不存在" ctx.JSON(400, resp) return } } else { res := db.Scopes(models.Paginate(page, pageSize)).Raw("SELECT * FROM flaws WHERE facility_id = ? "+ "UNION SELECT * FROM issues WHERE facility_id = ? "+ "UNION SELECT * FROM records WHERE facility_id = ? "+ "UNION SELECT * FROM qualities WHERE facility_id = ? "+ "UNION SELECT * FROM inspections WHERE facility_id = ?", "code", "code", "code", "code", "code").Find(&req) if res.RowsAffected == 0 { resp.Code = 400 resp.Msg = "记录不存在" ctx.JSON(400, resp) return } } resp.Data = req ctx.JSON(200, resp) } else if label < 1 || label > 4 { var req []*Total res := db.Scopes(models.Paginate(page, pageSize)).Raw("SELECT * FROM flaws WHERE label = ? "+ "UNION SELECT * FROM issues WHERE label = ? "+ "UNION SELECT * FROM records WHERE label = ? "+ "UNION SELECT * FROM qualities WHERE label = ? "+ "UNION SELECT * FROM inspections WHERE label = ?", "label", "label", "label", "label", "label").Find(&req) if res.RowsAffected == 0 { resp.Code = 400 resp.Msg = "记录不存在" ctx.JSON(400, resp) return } resp.Data = req ctx.JSON(200, resp) } else { ctx.JSON(400, models.Response{ Code: 400, Msg: "参数有误", }) return } }
以下是改进的代码:
```go
func TracingList(ctx *gin.Context) {
resp := models.Response{
Code: 0,
Msg: "success",
}
code := ctx.Query("code")
if len(code) == 0 {
resp.Code = 400
resp.Msg = "请输入code值"
ctx.JSON(400, resp)
return
}
t, err := strconv.Atoi(ctx.Query("t"))
if err != nil || t < 0 || t > 5 {
resp.Code = 400
resp.Msg = "无效的参数t"
ctx.JSON(400, resp)
return
}
label, err := strconv.Atoi(ctx.Query("label"))
if err != nil || label < 1 || label > 4 {
resp.Code = 400
resp.Msg = "无效的参数label"
ctx.JSON(400, resp)
return
}
page, err := strconv.Atoi(ctx.DefaultQuery("page", "1"))
if err != nil || page < 1 {
resp.Code = 400
resp.Msg = "无效的参数page"
ctx.JSON(400, resp)
return
}
pageSize, err := strconv.Atoi(ctx.DefaultQuery("pageSize", "10"))
if err != nil || pageSize < 1 {
resp.Code = 400
resp.Msg = "无效的参数pageSize"
ctx.JSON(400, resp)
return
}
var req interface{}
switch t {
case 0:
req = []*Total{}
case 1:
req = []*models.Flaw{}
case 2:
req = []*models.Issue{}
case 3:
req = []*models.Record{}
case 4:
req = []*models.Quality{}
case 5:
req = []*models.Inspection{}
}
db := common.DB.Session(&gorm.Session{})
res := db.Scopes(models.Paginate(page, pageSize)).Where("facility_id=?", code)
if t >= 1 && t <= 5 {
res = res.Table("flaws").Where("facility_id=?", code).
Or("facility_id=?", code).
Or("facility_id=?", code).
Or("facility_id=?", code).
Or("facility_id=?", code)
}
res.Find(req)
if res.RowsAffected == 0 {
resp.Code = 400
resp.Msg = "记录不存在"
ctx.JSON(400, resp)
return
}
resp.Data = req
ctx.JSON(200, resp)
}
```
主要改进包括:
1. 对输入的参数进行了有效性检查,如 t、label、page 和 pageSize 都需要为正整数,code 不能为空。
2. 使用了 Go 语言内置的错误处理机制,当参数无效时,返回错误信息。
3. 将 SQL 查询语句拆分为两段,根据 t 的值判断使用哪一段,避免了使用 Raw() 方法的安全隐患。
4. 代码结构更加清晰,易于阅读和维护。
题目描述: 请用您熟悉的语言完成如下功能,并提供源代码 这是一个将参数配置json文件,转换成列表格式json的需求。 读取文件params.json 提取其中的信息,转换成target.json,格式范例见target_sample.json 规则如下: 没有id的对象不需要转换 id>=8000的对象不需要转换 在id转换成name的时候,在id前加上“flaw_type_”拼接成name nickName是show属性的转换 子对象的nickName 是父对象的属性名为Attributes的兄弟对象的show属性加上“_”下划线,再加自身的show属性拼接而成。 在实际应用中,params.json 是因每个项目不同,子对象嵌套层数可能不同(可能嵌套两层、三层、四层......),但是格式不会发生变化,请在代码中考虑到通用化的情况。
以下是Python语言的实现代码:
```python
import json
def transform_name(id):
if id < 8000:
return "flaw_type_" + str(id)
else:
return ""
def transform_nickName(show, parent_attributes, siblings):
siblings_show = ""
for sibling in siblings:
if sibling != parent_attributes and "show" in sibling:
siblings_show += sibling["show"] + "_"
return siblings_show + show
def transform_object(obj, attributes):
result = {}
if "id" in obj and obj["id"] and obj["id"] < 8000:
result["name"] = transform_name(obj["id"])
result["nickName"] = transform_nickName(obj["show"], attributes, obj["Attributes"])
if "Properties" in obj:
result["Properties"] = []
for property in obj["Properties"]:
result["Properties"].append(transform_object(property, obj["Attributes"]))
else:
return None
return result
def transform_params_to_target():
with open("params.json", "r") as f:
params = json.load(f)
target = []
for obj in params:
transformed_obj = transform_object(obj, params)
if transformed_obj:
target.append(transformed_obj)
with open("target.json", "w") as f:
json.dump(target, f, indent=4)
if __name__ == "__main__":
transform_params_to_target()
```
其中,`transform_name`函数用于将id转换为name,`transform_nickName`函数用于将show属性转换为nickName。`transform_object`函数用于递归地将一个对象转换为目标格式,`transform_params_to_target`函数用于读取params.json文件,并将每个对象转换为目标格式,最终输出为target.json文件。这份代码可以通用于不同嵌套层数的params.json文件。
阅读全文