@ -16,10 +16,15 @@
@@ -16,10 +16,15 @@
package org.springframework.boot.json ;
import java.util.Collections ;
import java.util.LinkedHashSet ;
import java.util.List ;
import java.util.Map ;
import java.util.Set ;
import java.util.stream.Collectors ;
import org.yaml.snakeyaml.Yaml ;
import org.yaml.snakeyaml.constructor.Constructor ;
/ * *
* Thin wrapper to adapt Snake { @link Yaml } to { @link JsonParser } .
@ -31,16 +36,36 @@ import org.yaml.snakeyaml.Yaml;
@@ -31,16 +36,36 @@ import org.yaml.snakeyaml.Yaml;
* /
public class YamlJsonParser extends AbstractJsonParser {
private final Yaml yaml = new Yaml ( new TypeLimitedConstructor ( ) ) ;
@Override
@SuppressWarnings ( "unchecked" )
public Map < String , Object > parseMap ( String json ) {
return parseMap ( json , ( trimmed ) - > new Yaml ( ) . loadAs ( trimmed , Map . class ) ) ;
return parseMap ( json , ( trimmed ) - > this . yaml . loadAs ( trimmed , Map . class ) ) ;
}
@Override
@SuppressWarnings ( "unchecked" )
public List < Object > parseList ( String json ) {
return parseList ( json , ( trimmed ) - > new Yaml ( ) . loadAs ( trimmed , List . class ) ) ;
return parseList ( json , ( trimmed ) - > this . yaml . loadAs ( trimmed , List . class ) ) ;
}
private static class TypeLimitedConstructor extends Constructor {
private static final Set < String > SUPPORTED_TYPES ;
static {
Set < Class < ? > > supportedTypes = new LinkedHashSet < > ( ) ;
supportedTypes . add ( List . class ) ;
supportedTypes . add ( Map . class ) ;
SUPPORTED_TYPES = supportedTypes . stream ( ) . map ( Class : : getName )
. collect ( Collectors . collectingAndThen ( Collectors . toSet ( ) , Collections : : unmodifiableSet ) ) ;
}
@Override
protected Class < ? > getClassForName ( String name ) throws ClassNotFoundException {
return ( SUPPORTED_TYPES . contains ( name ) ) ? super . getClassForName ( name ) : null ;
}
}
}