git 如何使用PowerShell将新的json键和值对附加到现有.json文件的中间,而无需重写整个文件

2admgd59  于 2023-09-29  发布在  Git
关注(0)|答案(2)|浏览(77)

我在GitHub上有一个类似下面的.json文件。

{
    "quiz": {
        "sport": {
            "q1": {
                "question": "Which one is correct team name in NBA?",
                "options": [
                    "New York Bulls",
                    "Los Angeles Kings",
                    "Golden State Warriros",
                    "Huston Rocket"
                ],
                "answer": "Huston Rocket"
            }
        },
        "maths": {
            "q1": {
                "question": "5 + 7 = ?",
                "options": [
                    "10",
                    "11",
                    "12",
                    "13"
                ],
                "answer": "12"
            },
            "q2": {
                "question": "12 - 8 = ?",
                "options": [
                    "1",
                    "2",
                    "3",
                    "4"
                ],
                "answer": "4"
            }
        }
    }
}

我想添加新的键和值到“数学”使用PowerShell。在将git repo克隆到我的本地目录后,我尝试了以下命令

$FilePath = 'C:\Users\test.json

$y = Get-Content $FilePath | ConvertFrom-Json
$value = @`
   {
                "question": "12 - 6 = ?",
                "options": [
                    "1",
                    "2",
                    "3",
                    "6"
                ],
                "answer": "6"
      }
`@
$resultObject = $value | ConvertFrom-Json
$y.quiz.maths | Add-Member -MemberType NoteProperty -Name "q3" -Value $resultObject
$y | ConvertTo-Json -Depth 3 | Set-Content -Path $FilePath

然后承诺并推动变革。当我检查“main”分支和我的“feature”分支之间的比较时,由于新的空白,整个文件已经被重写。
注意事项:
1.“-compress”命令在这里没有帮助
1.如果我合并,并再次提出一个PR与新的价值观,它只给出了具体的提交,但这将继续不必要的空白
问题;

1.有没有合适的方法可以避免出现多余的空格
2.我们可以不转换成PowerShell对象来做吗?我知道我们可以使用'-Raw'选项将其转换为'String',那么我们如何添加上面的新属性并进行只有特定更改的单次提交
3.除了以上两个选项外,是否还有其他方法可以使用PowerShell向此.json文件添加新值?

rxztt3cl

rxztt3cl1#

我们可以简单地将PowerShell版本更新到7+,并在转换为PowerShell对象时使用-Depth选项,并在转换回JSON文件时使用相同的Depth选项。这样,它就解决了这个问题

jchrr9hc

jchrr9hc2#

这似乎是一个使用Class定义“问题”结构的好地方,它可以更容易地将新问题添加到JSON文件中。
第一步是定义类:

class Question {
    [string] $question
    [string[]] $options
    [string] $answer

    Question([string] $question) {
        $this.question = $question
    }

    [Question] AddOptions([scriptblock] $options) {
        $this.options = $options.Invoke()
        return $this
    }

    [Question] AddAnswer([string] $answer) {
        $this.answer = $answer
        return $this
    }

    [psnoteproperty] ToNoteProperty([string] $name) {
        return [psnoteproperty]::new($name, $this)
    }
}

现在你可以这样重复使用它(创建新问题):

$newQuestion = [Question]::new('12 - 6 = ?').
    AddOptions{ 1, 2, 3, 6 }.
    AddAnswer(6).
    ToNoteProperty('q3')

最后,你可以像这样将这个新问题添加到你的Json中:

$json = Get-Content path\to\jsonfile.json -Raw | ConvertFrom-Json
# `.quiz.maths` is the variable path here, the rest would remain the same
$json.quiz.maths.PSObject.Properties.Add($newQuestion)
$json | ConvertTo-Json -Depth 4 | Set-Content path\to\jsonfile.json

从这个例子中得到的Json将是:

{
  "quiz": {
    "sport": {
      "q1": {
        "question": "Which one is correct team name in NBA?",
        "options": [
          "New York Bulls",
          "Los Angeles Kings",
          "Golden State Warriros",
          "Huston Rocket"
        ],
        "answer": "Huston Rocket"
      }
    },
    "maths": {
      "q1": {
        "question": "5 + 7 = ?",
        "options": [
          "10",
          "11",
          "12",
          "13"
        ],
        "answer": "12"
      },
      "q2": {
        "question": "12 - 8 = ?",
        "options": [
          "1",
          "2",
          "3",
          "4"
        ],
        "answer": "4"
      },
      "q3": {
        "question": "12 - 6 = ?",
        "options": [
          "1",
          "2",
          "3",
          "6"
        ],
        "answer": "6"
      }
    }
  }
}

相关问题