Skip to content

fix(go): handle loosely formatted JSON markdown blocks#4700

Open
hugoaguirre wants to merge 1 commit intomainfrom
haguirre/json
Open

fix(go): handle loosely formatted JSON markdown blocks#4700
hugoaguirre wants to merge 1 commit intomainfrom
haguirre/json

Conversation

@hugoaguirre
Copy link
Contributor

Fix for a bug where ai.Generate could generate loosely formated JSON Markdown code blocks.

Checklist (if applicable):

@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello @hugoaguirre, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request addresses a bug where the ai.Generate function failed to correctly parse JSON output from models if the JSON was wrapped in loosely formatted markdown code blocks. The changes enhance the robustness of JSON extraction by improving the regular expressions used to identify and extract JSON content from markdown, accommodating variations in spacing and implicit JSON blocks. This ensures that ai.Generate can reliably process model outputs, even when they deviate slightly from strict markdown formatting.

Highlights

  • Improved JSON Markdown Parsing: The jsonMarkdownRegex was updated to correctly parse JSON blocks even when there are spaces around the json language identifier (e.g., ``` json).
  • Support for Implicit JSON Blocks: A new regex, implicitJSONRegex, was introduced to extract JSON from markdown code blocks that lack an explicit language identifier but start with a JSON object { or array [.
  • Expanded Test Coverage: New test cases were added in json_test.go to validate the handling of loosely formatted and implicit JSON markdown blocks, and a new TestGenerateWithMarkdownJSON function was added in generate_test.go to ensure ai.Generate correctly processes these outputs.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Changelog
  • go/ai/generate_test.go
    • Removed redundant empty lines in TestGenerateText and TestGenerateData.
    • Added TestGenerateWithMarkdownJSON to verify the Generate function's ability to handle both standard and loosely formatted JSON markdown outputs.
  • go/internal/base/json.go
    • Modified jsonMarkdownRegex to allow for spaces around the json language identifier in markdown code blocks.
    • Introduced implicitJSONRegex to detect JSON blocks without a language identifier, provided they start with { or [.
    • Updated ExtractJSONFromMarkdown to first attempt matching with jsonMarkdownRegex, then plainMarkdownRegex, and finally implicitJSONRegex for more flexible JSON extraction.
  • go/internal/base/json_test.go
    • Added new test cases to TestExtractJSONFromMarkdown to cover scenarios with spaces in the json markdown block identifier and implicit JSON blocks (both objects and arrays).
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request enhances the ExtractJSONFromMarkdown utility to be more flexible in parsing JSON content embedded within markdown code blocks. Specifically, the jsonMarkdownRegex was updated to tolerate optional whitespace around the json language identifier, and a new implicitJSONRegex was introduced to identify JSON blocks that lack an explicit language identifier but start with a { or [. Corresponding new test cases were added in json_test.go to validate these parsing improvements, including handling JSON blocks with spaces in the identifier and implicitly recognized JSON. Additionally, a new test TestGenerateWithMarkdownJSON was added in generate_test.go to confirm that the Generate function correctly extracts and unmarshals JSON from both standard and loosely formatted markdown outputs from mock models. Minor formatting changes were also applied to existing test calls in generate_test.go.

@hugoaguirre hugoaguirre marked this pull request as ready for review February 16, 2026 22:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

[Go] Models wrap JSON in backticks breaking structured output parsing

1 participant