docs: public static ComputationGraphConfiguration fromJson(String json) {
          //As per MultiLayerConfiguration.fromJson()
          ObjectMapper mapper = NeuralNetConfiguration.mapper();
          ComputationGraphConfiguration conf;
          try {
              conf = mapper.readValue(json, ComputationGraphConfiguration.class);
          } catch (Exception e) {
              //Check if this exception came from legacy deserializer...
              String msg = e.getMessage();
              if(msg != null && msg.contains("legacy")){
                  throw new RuntimeException("Error deserializing ComputationGraphConfiguration - configuration may have a custom " +
                          "layer, vertex or preprocessor, in pre version 1.0.0-alpha JSON format. These layers can be " +
                          "deserialized by first registering them with NeuralNetConfiguration.registerLegacyCustomClassesForJSON(Class...)", e);
              }
              throw new RuntimeException(e);
          }
  
          //To maintain backward compatibility after activation function refactoring (configs generated with v0.7.1 or earlier)
          // Previously: enumeration used for activation functions. Now: use classes
          int layerCount = 0;
          Map<String, GraphVertex> vertexMap = conf.getVertices();
          JsonNode vertices = null;
          for (Map.Entry<String, GraphVertex> entry : vertexMap.entrySet()) {
              if (!(entry.getValue() instanceof LayerVertex)) {
                  continue;
              }
  
              LayerVertex lv = (LayerVertex) entry.getValue();
              if (lv.getLayerConf() != null && lv.getLayerConf().getLayer() != null) {
                  Layer layer = lv.getLayerConf().getLayer();
  
                  if (layer instanceof BaseLayer && ((BaseLayer) layer).getActivationFn() == null) {
                      String layerName = layer.getLayerName();
  
                      try {
                          if (vertices == null) {
                              JsonNode jsonNode = mapper.readTree(json);
                              vertices = jsonNode.get("vertices");
                          }
  
                          JsonNode vertexNode = vertices.get(layerName);
                          JsonNode layerVertexNode = vertexNode.get("LayerVertex");
                          if (layerVertexNode == null || !layerVertexNode.has("layerConf")
                                          || !layerVertexNode.get("layerConf").has("layer")) {
                              continue;
                          }
                          JsonNode layerWrapperNode = layerVertexNode.get("layerConf").get("layer");
  
                          if (layerWrapperNode == null || layerWrapperNode.size() != 1) {
                              continue;
                          }
  
                          JsonNode layerNode = layerWrapperNode.elements().next();
                          JsonNode activationFunction = layerNode.get("activationFunction"); //Should only have 1 element: "dense", "output", etc
  
                          if (activationFunction != null) {
                              IActivation ia = Activation.fromString(activationFunction.asText()).getActivationFunction();
                              ((BaseLayer) layer).setActivationFn(ia);
                          }
  
                      } catch (IOException e) {
                          log.warn("Layer with null ActivationFn field or pre-0.7.2 activation function detected: could not parse JSON",
                                          e);
                      }
                  }
  
                  handleLegacyWeightInitFromJson(json, layer, mapper, vertices);
              }
          }
  
          return conf;
      }