diff --git a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/document/DocumentParser.java b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/document/DocumentParser.java
new file mode 100644
index 00000000..c93e49e3
--- /dev/null
+++ b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/document/DocumentParser.java
@@ -0,0 +1,27 @@
+package com.alibaba.cloud.ai.document;
+
+import org.springframework.ai.document.Document;
+
+import java.io.InputStream;
+import java.util.List;
+
+/**
+ * @author HeYQ
+ * @since 2024-12-02 11:25
+ */
+
+public interface DocumentParser {
+
+ /**
+ * Parses a given {@link InputStream} into a {@link Document}. The specific
+ * implementation of this method will depend on the type of the document being parsed.
+ *
+ * Note: This method does not close the provided {@link InputStream} - it is the
+ * caller's responsibility to manage the lifecycle of the stream.
+ * @param inputStream The {@link InputStream} that contains the content of the
+ * {@link Document}.
+ * @return The parsed {@link Document}.
+ */
+ List parse(InputStream inputStream);
+
+}
diff --git a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/document/JsonDocumentParser.java b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/document/JsonDocumentParser.java
new file mode 100644
index 00000000..2cdc8dfe
--- /dev/null
+++ b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/document/JsonDocumentParser.java
@@ -0,0 +1,112 @@
+package com.alibaba.cloud.ai.document;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.ai.document.Document;
+import org.springframework.ai.reader.EmptyJsonMetadataGenerator;
+import org.springframework.ai.reader.JsonMetadataGenerator;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.StreamSupport;
+
+/**
+ * @author HeYQ
+ * @since 2024-12-08 21:13
+ */
+
+public class JsonDocumentParser implements DocumentParser {
+
+ private final JsonMetadataGenerator jsonMetadataGenerator;
+
+ private final ObjectMapper objectMapper = new ObjectMapper();
+
+ /**
+ * The key from the JSON that we will use as the text to parse into the Document text
+ */
+ private final List jsonKeysToUse;
+
+ public JsonDocumentParser(String... jsonKeysToUse) {
+ this(new EmptyJsonMetadataGenerator(), jsonKeysToUse);
+ }
+
+ public JsonDocumentParser(JsonMetadataGenerator jsonMetadataGenerator, String... jsonKeysToUse) {
+ Objects.requireNonNull(jsonKeysToUse, "keys must not be null");
+ Objects.requireNonNull(jsonMetadataGenerator, "jsonMetadataGenerator must not be null");
+ this.jsonMetadataGenerator = jsonMetadataGenerator;
+ this.jsonKeysToUse = List.of(jsonKeysToUse);
+ }
+
+ @Override
+ public List parse(InputStream inputStream) {
+ try {
+ JsonNode rootNode = this.objectMapper.readTree(inputStream);
+
+ if (rootNode.isArray()) {
+ return StreamSupport.stream(rootNode.spliterator(), true)
+ .map(jsonNode -> parseJsonNode(jsonNode, this.objectMapper))
+ .toList();
+ }
+ else {
+ return Collections.singletonList(parseJsonNode(rootNode, this.objectMapper));
+ }
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private Document parseJsonNode(JsonNode jsonNode, ObjectMapper objectMapper) {
+ Map item = objectMapper.convertValue(jsonNode, new TypeReference