英文:
Cannot remove specific key: value from YAML file
问题
---
swagger: "2.0"
info:
description: "Planner application is a proposal system enables user to create, manage\
\ plan . \nIt also enables network user to publish plan "
version: "1.0"
title: "Planner API"
contact:
name: "API team"
email: "apiteam@test.com"
license:
name: "Copyright © 2020 test"
host: "aos-dev.test.com"
basePath: "/unifiedplanner"
tags:
- name: "Additional Fee APIs"
description: "Additional Fee Controller"
- name: "Condition APIs"
description: "Condition Controller"
paths:
/v1/{apiKey}/entity/{entityId}:
post:
tags:
- "Condition APIs"
summary: "Save New Conditions Entity"
operationId: "saveNewConditions"
consumes:
- "application/json"
produces:
- "application/json"
parameters:
- name: "Authorization"
in: "header"
description: "Authorization"
required: true
type: "string"
- name: "apiKey"
in: "path"
description: "API Key"
required: true
type: "string"
- in: "body"
name: "conditions"
description: "Conditions Entity that needs to be saved"
required: true
schema:
$ref: "#/definitions/Conditions"
- name: "entityId"
in: "path"
description: "Entity ID"
required: true
type: "string"
responses:
"200":
description: "OK"
schema:
$ref: "#/definitions/Conditions"
deprecated: false
put:
tags:
- "Condition APIs"
summary: "Modify / Overwrite existing Conditions Entity"
operationId: "modifyConditions"
consumes:
- "application/json"
produces:
- "application/json"
parameters:
- name: "Authorization"
in: "header"
description: "Authorization"
required: true
type: "string"
- name: "apiKey"
in: "path"
description: "API Key"
required: true
type: "string"
- in: "body"
name: "conditions"
description: "Conditions Entity that needs to be updated"
required: true
schema:
$ref: "#/definitions/Conditions"
- name: "entityId"
in: "path"
description: "Entity ID"
required: true
type: "string"
responses:
"200":
description: "OK"
schema:
$ref: "#/definitions/Conditions"
deprecated: false
definitions:
AbstractCondition:
type: "object"
properties:
externalTrafficSystem:
$ref: "#/definitions/ExternalTrafficSystem"
id:
type: "string"
version:
type: "integer"
format: "int64"
title: "AbstractCondition"
英文:
Goal: I want to remove specific key and its associated value from a YAML file.
Expected Result: orginalRef
key and it's value should be removed from the YAML file and should generate a new YAML file.
Actual Result: orginalRef
value under the responses
property doesn't remove.
Error messages: There are no error messages.
What I have tried: I have a swagger YAML file, I just load it into Jackson ObjectMapper and trying to do the removing of some keys from that YAML file. Then generate a new YAML file with the changes I have made.
Code:
below is a section my huge YAML file. It's name is api.yaml
---
swagger: "2.0"
info:
description: "Planner application is a proposal system enables user to create, manage\
\ plan . \nIt also enables network user to publish plan "
version: "1.0"
title: "Planner API"
contact:
name: "API team"
email: "apiteam@test.com"
license:
name: "Copyright © 2020 test
host: "aos-dev.test.com"
basePath: "/unifiedplanner"
tags:
- name: "Additional Fee APIs"
description: "Additional Fee Controller"
- name: "Condition APIs"
description: "Condition Controller"
paths:
/v1/{apiKey}/entity/{entityId}:
post:
tags:
- "Condition APIs"
summary: "Save New Conditions Entity"
operationId: "saveNewConditions"
consumes:
- "application/json"
produces:
- "application/json"
parameters:
- name: "Authorization"
in: "header"
description: "Authorization"
required: true
type: "string"
- name: "apiKey"
in: "path"
description: "API Key"
required: true
type: "string"
- in: "body"
name: "conditions"
description: "Conditions Entity that needs to be saved"
required: true
schema:
$ref: "#/definitions/Conditions"
- name: "entityId"
in: "path"
description: "Entity ID"
required: true
type: "string"
responses:
"200":
description: "OK"
schema:
$ref: "#/definitions/Conditions"
originalRef: "Conditions"
deprecated: false
put:
tags:
- "Condition APIs"
summary: "Modify / Overwrite existing Conditions Entity"
operationId: "modifyConditions"
consumes:
- "application/json"
produces:
- "application/json"
parameters:
- name: "Authorization"
in: "header"
description: "Authorization"
required: true
type: "string"
- name: "apiKey"
in: "path"
description: "API Key"
required: true
type: "string"
- in: "body"
name: "conditions"
description: "Conditions Entity that needs to be updated"
required: true
schema:
$ref: "#/definitions/Conditions"
- name: "entityId"
in: "path"
description: "Entity ID"
required: true
type: "string"
responses:
"200":
description: "OK"
schema:
$ref: "#/definitions/Conditions"
originalRef: "Conditions"
deprecated: false
definitions:
AbstractCondition:
type: "object"
properties:
externalTrafficSystem:
$ref: "#/definitions/ExternalTrafficSystem"
originalRef: "ExternalTrafficSystem"
id:
type: "string"
version:
type: "integer"
format: "int64"
title: "AbstractCondition"
As you can see I just want to remove originalRef
key and it's value from the responses
property in the above YAML file.
Below is my YamlProcessor.java class which does all the necessary things.
package com.aos.tools.aostool.yaml;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import org.springframework.stereotype.Service;
import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.stream.Stream;
@Service
public class YamlProcessor {
public YamlProcessor() throws IOException {
process();
}
public void process() throws IOException {
final ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
final Map<String, Object> api = objectMapper.readValue(new File("api.yaml"),
new TypeReference<Map<String, Object>>() {
});
final Map<String, Object> path = (Map<String, Object>) api.get("paths");
processPath(path);
// write YAML file
final Date date = Calendar.getInstance().getTime();
objectMapper.writeValue(new File(date.toString() + "api-updated.yaml"), api);
}
private void processPath(final Map<String, Object> paths) {
paths.entrySet().forEach(path -> {
if (null != path) {
final Map<String, Object> level1Child = (Map<String, Object>) path.getValue();
if (null != level1Child) {
level1Child.entrySet().forEach(method -> {
final Map<String, Object> methodValues = (Map<String, Object>) method.getValue();
methodValues.entrySet().forEach(methodValue -> {
if (null != methodValue && methodValue.getKey().equals("parameters")) {
final List<Object> paramValue = (List<Object>) methodValue.getValue();
paramValue.forEach(paramValueChild -> {
if (null != paramValueChild) {
final Map<String, Object> paramMap = (HashMap<String, Object>) paramValueChild;
paramMap.entrySet().forEach(k -> {
if (k.getKey().contains("schema")) {
final Map<String, Object> schema = (HashMap<String, Object>) k.getValue();
// this line works fine , this will remove all the originalRef keys under parameters property
schema.remove("originalRef");
}
});
}
});
}
// this is where I'm currently getting stucked.
if (null != methodValue && methodValue.getKey().equals("responses")) {
Map<String,Object> value = (HashMap<String,Object>) methodValue.getValue();
if(value.containsKey("200")) {
value.entrySet().forEach(k -> {
if(k.getKey().contains("schema")) {
Map<String,Object> responseSchema = (HashMap<String,Object>)k.getValue();
responseSchema.remove("originalRef");
}
});
}
}
});
});
}
}
});
}
}
When I run the application , It works fine without any errors. Also generating new YAML file.
but in the new YAML file, there is still originlaRef key contains under the responses property.
Anyone guide my What I'm doing wrong here.
Any help would be highly appreciated.
Cheers! Good day!
答案1
得分: 0
你正在迭代value的内容,而不是value.200。
if(value.containsKey("200")) {
value.entrySet().forEach(k -> {
可能应改为:
if(value.containsKey("200")) {
value.get("200").entrySet().forEach(k -> {
无论如何,你可以在循环内部添加日志语句来调试此类问题。
英文:
You are iterating the content of value, not value.200
if(value.containsKey("200")) {
value.entrySet().forEach(k -> {
should probably be
if(value.containsKey("200")) {
value.get("200").entrySet().forEach(k -> {
In any case, you could put log statements inside the loops for debugging such things.
答案2
得分: 0
以下是对您提供的内容的翻译:
最终,通过对我的代码进行试验,我终于得到了所期望的输出。
以下是适用于我的可行解决方案。
if (value.containsKey("200")) {
value.entrySet().forEach(k -> {
Map<String, Object> responseSchema = (HashMap<String, Object>) k.getValue();
responseSchema.entrySet().forEach(a -> {
if (a.getKey().contains("schema")) {
Map<String, Object> reSchema = (HashMap<String, Object>) a.getValue();
reSchema.entrySet().forEach(c -> {
if (c.getKey().contains("items")) {
Map<String, Object> innerSchema = (HashMap<String, Object>) c.getValue();
innerSchema.remove("originalRef");
}
});
}
});
});
}
英文:
finally I was able to get the desired output by experiment with my code.
below is the working solution for me.
if(value.containsKey("200")) {
value.entrySet().forEach(k -> {
Map<String,Object> responseSchema = (HashMap<String,Object>) k.getValue();
responseSchema.entrySet().forEach(a -> {
if(a.getKey().contains("schema")) {
Map<String,Object> reSchema = (HashMap<String,Object>)a.getValue();
reSchema.entrySet().forEach(c -> {
if(c.getKey().contains("items")) {
Map<String,Object> innerSchema = (HashMap<String,Object>) c.getValue();
innerSchema.remove("originalRef");
}
});
}
});
});
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论