public static PutBlobMetaInfo deserialize(String metaInfo) throws IOException {
    List<Pair<String, Long>> orderedChunkIdSizeList = new ArrayList<>();

    JsonNode rootNode;
    try {
      rootNode = objectMapper.readTree(metaInfo);
    } catch (JsonProcessingException e) {
      throw new IOException("Not expected JSON content " + metaInfo + e.getMessage());
    }

    // loop all the data chunks
    JsonNode jsonNode = rootNode.get(CHUNKS);
    if (jsonNode.isArray()) {
      for (final JsonNode objNode : jsonNode) {
        String blobId = objNode.get(BLOB).textValue();
        Long chunkSizeBytes = objNode.get(SIZE).longValue();
        orderedChunkIdSizeList.add(new Pair<>(blobId, chunkSizeBytes));
      }
    } else {
      throw new IOException("Not expected JSON content " + metaInfo);
    }

    // reserved metadata chunk id. it can be null.
    jsonNode = rootNode.get(RESERVED_METADATA_CHUNK_ID);
    String metaBlobId = null;
    if (jsonNode != null) {
      metaBlobId = jsonNode.textValue();
    }
    return new PutBlobMetaInfo(orderedChunkIdSizeList, metaBlobId);
  }
Deserialize a JSON string to a {@link PutBlobMetaInfo} object.
@param metaInfo the JSON string representation of the object
@return the {@link PutBlobMetaInfo}
ambry-api/src/main/java/com/github/ambry/frontend/PutBlobMetaInfo.java