Как перебрать объект конфигурации hocon?
У меня есть следующий JSON,
{
"child1-name" : {
"child1child1-name" : "child1child1-value",
"child1child2-name" : "child1child2-value"
},
"child2" : {
"child2child1-name" : "child2child1-value"
},
"child3-name" : "child3-value"
}
Теперь здесь, поскольку это объект конфигурации HOCON, я хочу перебрать его и рекурсивно извлечь каждый элемент. Я хочу перебрать каждый объект конфигурации и в зависимости от его типа (ArrayNode,ObjectNode,String и т. Д.) Установить соответствующее значение (комментарии) и вернуть этот узел, установив конечный объект конфигурации.
Я хочу добиться следующего кода Pusedo:
while(iterator.hasNext()) {
Entry<String, ConfigValue> fld = iterator.next();
// Now here access each object and value which will be of type of Configvalue
//If(ConfigValueType.OBJECT)
//set the required value
//else If(ConfigValueType.STRING)
//set the required value
}
//Once iteration done, set the new values in config and return final config object.
Следующий пример кода, о котором я думаю,
String jsonString = _mapper.writeValueAsString(jsonRoot); // jsonRoot is valid jsonNode object
Config config = ConfigFactory.parseString(jsonString);
//Now, I want to set comments by iterating the config object.
//I have gone through the following API’s,
ConfigObject co = config.root();
Set<Entry<String, ConfigValue>> configNode2 =co.entrySet();
Iterator<Entry<String, ConfigValue>> itr = configNode2.iterator();
while(itr.hasNext()){
Entry<String, ConfigValue> fld = itr.next();
// **how to set comments and return the config object** .
}
Основная причина для преобразования JSON в HOCON для меня, чтобы установить комментарии. Теперь в приведенном выше коде, я не уверен, как установить комментарии.
1 ответ
После прочтения и поиска типов безопасных API, которые были для меня сложными, я смог решить эту проблему, выполнив следующие действия:
List<String> comments = Arrays.asList("A new","comment");
String jsonString = "{ \"a\" : 42 , \"b\" : 18 }";
Config config = ConfigFactory.parseString(jsonString);
ConfigObject co = config.root();
ConfigObject co2 = co;
Set<Entry<String, ConfigValue>> configNode2 = co.entrySet();
Iterator<Entry<String, ConfigValue>> itr = configNode2.iterator();
while(itr.hasNext()){
Entry<String, ConfigValue> fld = itr.next();
String key = fld.getKey();
ConfigValue value = fld.getValue();
ConfigOrigin oldOrigin = value.origin();
ConfigOrigin newOrigin = oldOrigin.withComments(comments);
ConfigValue newValue = value.withOrigin(newOrigin);
// fld.setValue(newValue); // This doesn't work: it's immutable
co2 = co2.withValue(key,newValue);
}
config = co2.toConfig();
System.out.println(config.root().render(ConfigRenderOptions.concise().
setComments(true).setFormatted(true)));
Я надеюсь, что это поможет кому-то в будущем!