Python 如何在.json字典中的特定位置添加新键?

Python 如何在.json字典中的特定位置添加新键?,python,json,python-3.x,package.json,Python,Json,Python 3.x,Package.json,我想在预先存在的.json文件中添加一个新密钥 { "AcquisitionMatrixPE": 63, "AcquisitionNumber": 5, "AcquisitionTime": "08:06:20.100000", "BodyPartExamined": "BRAIN", "CogAtlasID": "TODO", "CoilString": "SENSE-Head-8", "ConversionSoftware": "dcm2niix", "Con

我想在预先存在的.json文件中添加一个新密钥

{
  "AcquisitionMatrixPE": 63,
  "AcquisitionNumber": 5,
  "AcquisitionTime": "08:06:20.100000",
  "BodyPartExamined": "BRAIN",
  "CogAtlasID": "TODO",
  "CoilString": "SENSE-Head-8",
  "ConversionSoftware": "dcm2niix",
  "ConversionSoftwareVersion": "v1.0.20190410  GCC6.3.0",
  "DeviceSerialNumber": "4sEr9bzYud6E",
  "EchoTime": 0.030001,
  "EchoTrainLength": 59,
  "FlipAngle": 80,
  "ImageOrientationPatientDICOM": [1, 0, 0, 0, 1, 0],
  "ImageType": [
    "ORIGINAL",
    "PRIMARY",
    "M",
    "FFE",
    "M",
    "FFE"
],
  "ImagingFrequency": 127.779,
  "InPlanePhaseEncodingDirectionDICOM": "COL",
  "InstitutionName": "OHSU_MRI3",
  "MRAcquisitionType": "2D",
  "MagneticFieldStrength": 3,
  "Manufacturer": "Philips",
  "ManufacturersModelName": "Intera",
  "Modality": "MR",
  "PartialFourier": 0.936508,
  "PatientPosition": "HFS",
  "PercentPhaseFOV": 93.75,
  "PhaseEncodingAxis": "j",
  "PhaseEncodingSteps": 63,
  "PhilipsRWVIntercept": 0,
  "PhilipsRWVSlope": 1.22833,
  "PhilipsRescaleIntercept": 0,
  "PhilipsRescaleSlope": 1.22833,
  "PhilipsScaleSlope": 0.000766453,
  "PixelBandwidth": 2110,
  "ProtocolName": "Resting_State_fMRI",
  "ReconMatrixPE": 64,
  "RepetitionTime": 3.001,
  "SAR": 0.0630149,
  "ScanOptions": "FS",
  "ScanningSequence": "GR",
  "SequenceVariant": "SK",
  "SeriesDescription": "Resting_State_fMRI",
  "SeriesNumber": 501,
  "SliceThickness": 3.313,
  "SoftwareVersions": "3.2.1_3.2.1.1",
  "SpacingBetweenSlices": 3.313,
  "TaskName": "TODO: full task name for rest",
  "UsePhilipsFloatNotDisplayScaling": 1,
  "dcmmeta_affine": [
    [-3.3125, 0.0, 0.0, 106.49729919433594],
    [0.0, 3.3125, 0.0, -96.91033935546875],
    [0.0, 0.0, 3.3125, -38.010536193847656],
    [0.0, 0.0, 0.0, 1.0]
],
  "dcmmeta_reorient_transform": [
    [0.0, -1.0, 0.0, 63.0],
    [1.0, 0.0, 0.0, 0.0],
    [0.0, 0.0, -1.0, 47.0],
    [0.0, 0.0, 0.0, 1.0]
],
  "dcmmeta_shape": [64, 64, 48, 140],
  "dcmmeta_slice_dim": 2,
  "dcmmeta_version": 0.6,
  "global": {
    "const": {
      "AcquisitionDuration": 423.1409912109375,
      "AcquisitionMatrix": [64, 0, 0, 63],
      "AcquisitionNumber": 5,
      "BitsAllocated": 16,
      "BitsStored": 16,
      "BodyPartExamined": "BRAIN",
      "Columns": 64,
      "DiffusionBValue": 0.0
      }
   }
}

import json

# Loading .json file
with open('/home/rrt/MyProject/Nifti2/task-rest_bold.json', 'r') as f:
    json_data = json.load(f)

# Print .json file with indent
print(json.dumps(json_data,indent="\t"))

# Check if "SliceTiming" exists
if 'SliceTiming' not in json_data:
    TR = json_data["RepetitionTime"]
    nSlices = json_data["dcmmeta_shape"][3]
    TA = TR/nSlices
    # Calculate SliceTiming
    SliceTiming = [0:TA:TR]


# Put SliceTiming into the .json file
json_data["SliceTiming"]= SliceTiming

if "SliceTiming" in json_data:
    print(json_data["SliceTiming"])
  • 是否可以将新钥匙放在特定位置? (ex)“切片厚度”=3 在“SliceThickness”键之后添加“SliceTiming”=0.1
  • 如何检查添加的一个?我在预先存在的.json文件中看不到添加的

    {
      "AcquisitionMatrixPE": 63,
      "AcquisitionNumber": 5,
      "AcquisitionTime": "08:06:20.100000",
      "BodyPartExamined": "BRAIN",
      "CogAtlasID": "TODO",
      "CoilString": "SENSE-Head-8",
      "ConversionSoftware": "dcm2niix",
      "ConversionSoftwareVersion": "v1.0.20190410  GCC6.3.0",
      "DeviceSerialNumber": "4sEr9bzYud6E",
      "EchoTime": 0.030001,
      "EchoTrainLength": 59,
      "FlipAngle": 80,
      "ImageOrientationPatientDICOM": [1, 0, 0, 0, 1, 0],
      "ImageType": [
        "ORIGINAL",
        "PRIMARY",
        "M",
        "FFE",
        "M",
        "FFE"
    ],
      "ImagingFrequency": 127.779,
      "InPlanePhaseEncodingDirectionDICOM": "COL",
      "InstitutionName": "OHSU_MRI3",
      "MRAcquisitionType": "2D",
      "MagneticFieldStrength": 3,
      "Manufacturer": "Philips",
      "ManufacturersModelName": "Intera",
      "Modality": "MR",
      "PartialFourier": 0.936508,
      "PatientPosition": "HFS",
      "PercentPhaseFOV": 93.75,
      "PhaseEncodingAxis": "j",
      "PhaseEncodingSteps": 63,
      "PhilipsRWVIntercept": 0,
      "PhilipsRWVSlope": 1.22833,
      "PhilipsRescaleIntercept": 0,
      "PhilipsRescaleSlope": 1.22833,
      "PhilipsScaleSlope": 0.000766453,
      "PixelBandwidth": 2110,
      "ProtocolName": "Resting_State_fMRI",
      "ReconMatrixPE": 64,
      "RepetitionTime": 3.001,
      "SAR": 0.0630149,
      "ScanOptions": "FS",
      "ScanningSequence": "GR",
      "SequenceVariant": "SK",
      "SeriesDescription": "Resting_State_fMRI",
      "SeriesNumber": 501,
      "SliceThickness": 3.313,
      "SoftwareVersions": "3.2.1_3.2.1.1",
      "SpacingBetweenSlices": 3.313,
      "TaskName": "TODO: full task name for rest",
      "UsePhilipsFloatNotDisplayScaling": 1,
      "dcmmeta_affine": [
        [-3.3125, 0.0, 0.0, 106.49729919433594],
        [0.0, 3.3125, 0.0, -96.91033935546875],
        [0.0, 0.0, 3.3125, -38.010536193847656],
        [0.0, 0.0, 0.0, 1.0]
    ],
      "dcmmeta_reorient_transform": [
        [0.0, -1.0, 0.0, 63.0],
        [1.0, 0.0, 0.0, 0.0],
        [0.0, 0.0, -1.0, 47.0],
        [0.0, 0.0, 0.0, 1.0]
    ],
      "dcmmeta_shape": [64, 64, 48, 140],
      "dcmmeta_slice_dim": 2,
      "dcmmeta_version": 0.6,
      "global": {
        "const": {
          "AcquisitionDuration": 423.1409912109375,
          "AcquisitionMatrix": [64, 0, 0, 63],
          "AcquisitionNumber": 5,
          "BitsAllocated": 16,
          "BitsStored": 16,
          "BodyPartExamined": "BRAIN",
          "Columns": 64,
          "DiffusionBValue": 0.0
          }
       }
    }
    
    import json
    
    # Loading .json file
    with open('/home/rrt/MyProject/Nifti2/task-rest_bold.json', 'r') as f:
        json_data = json.load(f)
    
    # Print .json file with indent
    print(json.dumps(json_data,indent="\t"))
    
    # Check if "SliceTiming" exists
    if 'SliceTiming' not in json_data:
        TR = json_data["RepetitionTime"]
        nSlices = json_data["dcmmeta_shape"][3]
        TA = TR/nSlices
        # Calculate SliceTiming
        SliceTiming = [0:TA:TR]
    
    
    # Put SliceTiming into the .json file
    json_data["SliceTiming"]= SliceTiming
    
    if "SliceTiming" in json_data:
        print(json_data["SliceTiming"])
    
    • 我正在使用python3和Jupyter笔记本
    • 预先存在的.json文件(名称:task-rest_bold.json)如下所示
  • 简而言之,我想在“切片厚度”之后加上“切片计时”。 另外,我想签入.json文件,因为下面的代码显示SliceTimeing已经成功添加,但是,我在“task\u rest\u bold.json”文件中找不到它


    查看其他来源,在JSON对象的中间添加一个值似乎是不可能的。

    关于这个问题的答案是:

    打开带有写入标志的文件:

    import json
    
    with open(json_file) as json_file:
        json_decoded = json.load(json_file)
    
    json_decoded['ADDED_KEY'] = 'ADDED_VALUE'
    
    with open(json_file, 'w') as json_file:
        json.dump(json_decoded, json_file)
    

    但是,该值会附加到json对象。

    您在文件中找不到它,也不会写入它。您必须将其保存回文件中。大多数/所有json解析器都不会保留json对象的顺序。有关更多详细信息,请参阅。json对象是无序的key:values集合(如本文所述)。我不习惯处理.json文件。。。。.json字典的顺序是否重要?有可能找到某个键的位置或索引吗?@user12077723:json对象是键:值对的无序集合。他们没有“索引”或“位置”。@Brunodesshuilliers是对的。JSON文件并不意味着可以原始查看,因此顺序并不重要。在代码中使用json文件时,键是检索链接到该键的数据所需的唯一值。不要太担心顺序,只要担心密钥和数据对是否在json文件中即可。