diff --git a/internal/cli/core/upgrade.go b/internal/cli/core/upgrade.go
index 3884bdd8129..54ce8e5bfc8 100644
--- a/internal/cli/core/upgrade.go
+++ b/internal/cli/core/upgrade.go
@@ -110,8 +110,9 @@ func Upgrade(inst *rpc.Instance, args []string, skipPostInstall bool) {
 		response, err := core.PlatformUpgrade(context.Background(), r, feedback.ProgressBar(), feedback.TaskProgress())
 		warningMissingIndex(response)
 		if err != nil {
-			if errors.Is(err, &arduino.PlatformAlreadyAtTheLatestVersionError{}) {
-				feedback.Print(err.Error())
+			var alreadyAtLatestVersionErr *arduino.PlatformAlreadyAtTheLatestVersionError
+			if errors.As(err, &alreadyAtLatestVersionErr) {
+				feedback.Warning(err.Error())
 				continue
 			}
 
@@ -122,4 +123,19 @@ func Upgrade(inst *rpc.Instance, args []string, skipPostInstall bool) {
 	if hasBadArguments {
 		feedback.Fatal(tr("Some upgrades failed, please check the output for details."), feedback.ErrBadArgument)
 	}
+
+	feedback.PrintResult(&platformUpgradeResult{})
+}
+
+// This is needed so we can print warning messages in case users use --format json
+type platformUpgradeResult struct{}
+
+// Data implements feedback.Result.
+func (r *platformUpgradeResult) Data() interface{} {
+	return r
+}
+
+// String implements feedback.Result.
+func (r *platformUpgradeResult) String() string {
+	return ""
 }
diff --git a/internal/integrationtest/core/core_test.go b/internal/integrationtest/core/core_test.go
index da13160ee1e..b2b68dd366e 100644
--- a/internal/integrationtest/core/core_test.go
+++ b/internal/integrationtest/core/core_test.go
@@ -1041,8 +1041,8 @@ func TestCoreUpgradeWarningWithPackageInstalledButNotIndexed(t *testing.T) {
 		_, _, err = cli.Run("core", "install", "test:x86@1.0.0", "--additional-urls="+url)
 		require.NoError(t, err)
 		//upgrade without index fires a warning
-		_, jsonStderr, _ := cli.Run("core", "upgrade", "test:x86", "--format", "json")
-		requirejson.Query(t, jsonStderr, ".warnings[]", `"missing package index for test:x86, future updates cannot be guaranteed"`)
+		jsonStdout, _, _ := cli.Run("core", "upgrade", "test:x86", "--format", "json")
+		requirejson.Query(t, jsonStdout, ".warnings[]", `"missing package index for test:x86, future updates cannot be guaranteed"`)
 	})
 
 	// removing installed.json
@@ -1050,7 +1050,7 @@ func TestCoreUpgradeWarningWithPackageInstalledButNotIndexed(t *testing.T) {
 	require.NoError(t, os.Remove(installedJson.String()))
 
 	t.Run("missing both installed.json and additional-urls", func(t *testing.T) {
-		_, jsonStderr, _ := cli.Run("core", "upgrade", "test:x86", "--format", "json")
-		requirejson.Query(t, jsonStderr, ".warnings[]", `"missing package index for test:x86, future updates cannot be guaranteed"`)
+		jsonStdout, _, _ := cli.Run("core", "upgrade", "test:x86", "--format", "json")
+		requirejson.Query(t, jsonStdout, ".warnings[]", `"missing package index for test:x86, future updates cannot be guaranteed"`)
 	})
 }