c# - 写入动态 JSON 对象

标签 c# json dynamic

我有一个相当大的 JSON 对象,我已使用 this post 中表示的方法在 c# 中将其转换为动态对象。需要说明的是,我使用的是寄存器序列化程序方法,而不是 MVC 库中的方法。

我可以很好地读取这些值;但是,我希望能够用新信息更新它们。每次我尝试时,程序都会崩溃,但没有太多关于原因的信息。有没有办法在不使用数据契约创建新类的情况下做到这一点?

如何将值写入此动态对象?

编辑

我一定是错误地引用了对象的值,因为我收到了 "{"'System.Dynamic.DynamicObject' does not contain a definition for 'password'"}" 错误消息。

这是JSON

{
  "cfgFileString": "Canopy configuration file",
  "deviceType": "3.6GHz MIMO OFDM - Subscriber Module",
  "cfgUtcTimestamp": "2011-01-01T00:01:59Z",
  "cfgFileVersion": "1.0",
  "srcMacAddress": "0a-00-3e-41-c3-a1",
  "swVersion": "CANOPY 14.2 (Build 30)  SM-DES",
  "userParameters": {
    "smSyncConfig": {
      "timingPulseGated": 1
    },
    "smSyslogConfig": {
      "syslogServerApPreferred": 1,
      "syslogSMXmitControl": 0
    },
    "smQosConfig": {
      "lowPriorityUplinkCIR": 0,
      "lowPriorityDownlinkCIR": 0,
      "highPriorityChannel": 0,
      "bCastMIR": 0,
      "bCastMIRUnits": 0
    },
    "authenticationConfig": {
      "whispWebUserAccessMode": 0,
      "allowRejectThenLocal": 0,
      "authenticationKeyEncrypted": "37107535bd95272afceb980bdb2379cd9340f71d22f07b0bb988bd8741cf3fdbf2b7da94b7481a4df0b5ed1fc2f8d7b4",
      "authKeyOption": 0,
      "accounts": [
        {
          "userName": "admin",
          "level": 3,
          "readOnly": false,
          "password": ""
        },
        {
          "userName": "root",
          "level": 3,
          "readOnly": false,
          "password": ""
        }
      ]
    },
    "smNetworkConfig": {
      "networkAccess": 0,
      "enable8023link": 1
    },
    "radioConfig": {
      "installationColorCode": 1,
      "antennaGain": 0,
      "factoryResetOnDefaultPlug": 0,
      "receiveQualityDebug": 0,
      "atexHazlocPowerLimit": 4,
      "regionCode": 0,
      "customFrequencies": [
        3652500,
        3655000,
        3657500,
        3660000,
        3662500,
        3665000,
        3667500,
        3670000,
        3672500,
        3675000,
        3677500,
        3680000,
        3682500,
        3685000,
        3687500,
        3690000,
        3692500,
        3695000,
        3697500
      ]
    },
    "smRadioConfig": {
      "powerUpMode": 0,
      "apSelection": 0,
      "frequencyScanList": [
        3652500,
        3655000,
        3657500,
        3660000,
        3662500,
        3665000,
        3667500,
        3670000,
        3672500,
        3675000,
        3677500,
        3680000,
        3682500,
        3685000,
        3687500,
        3690000,
        3692500,
        3695000,
        3697500
      ],
      "bandwidthScanList": [
        50,
        70,
        100,
        150,
        200,
        300,
        400
      ],
      "colorCodeList": [
        {
          "colorCode": 0,
          "priority": 1
        }
      ]
    },
    "smAuthenticationConfig": {
      "authenticationEnforce": 0,
      "phase1": 0,
      "phase2": 2,
      "authOuterId": "anonymous",
      "authPasswordEncrypted": "ba9122c25780be0f289120c382646277",
      "authUsername": "0a-00-3e-41-c3-a1",
      "useRealm": 0,
      "realm": "canopy.net",
      "certificates": [
        "-----BEGIN CERTIFICATE-----\nMIIDSDCCArGgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBwDELMAkGA1UEBhMCVVMx\nETAPBgNVBAgTCElsbGlub2lzMSEwHwYDVQQKExhNb3Rvcm9sYSBTb2x1dGlvbnMs\nIEluYy4xIjAgBgNVBAsTGUNhbm9weSBXaXJlbGVzcyBCcm9hZGJhbmQxIjAgBgNV\nBAMTGUNhbm9weSBBQUEgU2VydmVyIERlbW8gQ0ExMzAxBgkqhkiG9w0BCQEWJHRl\nY2huaWNhbC1zdXBwb3J0QGNhbm9weXdpcmVsZXNzLmNvbTAeFw0wMTAxMDEwMDAw\nMDBaFw00OTEyMzEyMzU5NTlaMIHAMQswCQYDVQQGEwJVUzERMA8GA1UECBMISWxs\naW5vaXMxITAfBgNVBAoTGE1vdG9yb2xhIFNvbHV0aW9ucywgSW5jLjEiMCAGA1UE\nCxMZQ2Fub3B5IFdpcmVsZXNzIEJyb2FkYmFuZDEiMCAGA1UEAxMZQ2Fub3B5IEFB\nQSBTZXJ2ZXIgRGVtbyBDQTEzMDEGCSqGSIb3DQEJARYkdGVjaG5pY2FsLXN1cHBv\ncnRAY2Fub3B5d2lyZWxlc3MuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB\ngQDAoLh7N/HKuUcmfkj1EWRxBiJqs1Z6jHhusEjNFNYgpZr2XC77jHq9RDhXOmmE\nCTz0RTHvqLXHduLIuI0aK+gpKD1wmphLfkrJHqn89BOyA3koW36thAto4MWGtb8q\n3o6NwNaCKzG8+vnxWrwj1HmRuZ+McCSsDTYYz/iOqT4+8QIDAQABo1AwTjAMBgNV\nHRMEBTADAQH/MB0GA1UdDgQWBBTrjCIRTYzG8JaP9+Izc7d7LrVpQDAfBgNVHSME\nGDAWgBTrjCIRTYzG8JaP9+Izc7d7LrVpQDANBgkqhkiG9w0BAQUFAAOBgQADYLaM\nZd3mhqzqFHmP4OQCn72nEfIEWkC+P3bNeHMS6bywIleAJkgSYswgtQHOVWgNyIaW\n4l2Z0B149W2fckczh8lZIIWE26H30psumyvKBD10VLwR0pzzldmxXlAcXT8Q2PkI\nlUS+AZWe+ca8Im8rQELPLbY9BpGOo8c1+okc0w==\n-----END CERTIFICATE-----\n",
        "-----BEGIN CERTIFICATE-----\nMIIC2TCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADB2MQswCQYDVQQGEwJVUzER\nMA8GA1UECBMISWxsaW5vaXMxFzAVBgNVBAoTDk1vdG9yb2xhLCBJbmMuMSIwIAYD\nVQQLExlDYW5vcHkgV2lyZWxlc3MgQnJvYWRiYW5kMRcwFQYDVQQDEw5QTVAzMjAg\nRGVtbyBDQTAeFw0wOTA3MDEwNjAwMDBaFw00OTEyMzEyMzU5NTlaMHYxCzAJBgNV\nBAYTAlVTMREwDwYDVQQIEwhJbGxpbm9pczEXMBUGA1UEChMOTW90b3JvbGEsIElu\nYy4xIjAgBgNVBAsTGUNhbm9weSBXaXJlbGVzcyBCcm9hZGJhbmQxFzAVBgNVBAMT\nDlBNUDMyMCBEZW1vIENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDinNt5\n6fA20zJqd2l72jBp/mu4K+NZtiXrk8Cpat6SaCNCEeRCoAfIpE5Alkajzq6jU6le\nrNCxJVuoOexjb8K4H9MPSB/LHv9i61JUMYECgiWXxz8sNTEbZnFcWB5hgb5ZPr2g\nbaqr8X9KRoiZ0MSzEzQsEkB79EGTyNvVItH2GQIDAQABo3cwdTAJBgNVHRMEAjAA\nMCgGCWCGSAGG+EIBDQQbFhlJbnNlY3VyZSBEZW1vIENlcnRpZmljYXRlMB0GA1Ud\nDgQWBBTaTn3PsiRFNAhrpYkzvZ7cfPhIdjAfBgNVHSMEGDAWgBTaTn3PsiRFNAhr\npYkzvZ7cfPhIdjANBgkqhkiG9w0BAQUFAAOBgQC7qaY808dmS7WUfKnAoblH2wZE\nHKjg6ivHl0GWeguhyuumhQDlkYoEsDesZa5FhuI6AUHpVnga1eNEGZ6es0/YHrVR\n5ZZkx7svAOEGo5mkc+j/cj1+zqRHCbdznGZU0gnL3Y0MV4oKcyhzGHL3dfwjlwA3\nZzSw0lSJRnC+dK4iBw==\n-----END CERTIFICATE-----\n"
      ]
    },
    "networkConfig": {
      "webAutoUpdate": 0,
      "bridgeEntryTimeout": 25,
      "lanDhcpState": 0,
      "dnsIpState": 1,
      "sessionTimeout": 600,
      "lldpBroadcastEnable": 0,
      "ethernetLinkSpeed": 15,
      "dnsPrimaryMgmtIP": "0.0.0.0",
      "dnsAlternateMgmtIP": "0.0.0.0",
      "dnsMgmtDomainName": "example.com",
      "ftpPort": 21,
      "httpPort": 80,
      "httpsPort": 443,
      "webAccess": 0,
      "snmpStatus": 1,
      "telnetStatus": 1,
      "ftpStatus": 1,
      "tftpStatus": 1,
      "enableSecurityBanner": 0,
      "textSecurityBanner": "example.com",
      "acceptSecurityBanner": 1,
      "packetFilterPppoe": 0,
      "packetFilterSmb": 0,
      "packetFilterSmbIpv6": 0,
      "packetFilterSnmp": 0,
      "packetFilterSnmpIpv6": 0,
      "packetFilterUser1": 0,
      "packetFilterUser2": 0,
      "packetFilterUser3": 0,
      "packetFilterOtherIpv4": 0,
      "packetFilterAllIpv6Others": 0,
      "packetFilterAllIpv4": 0,
      "packetFilterAllIpv6": 0,
      "packetFilterArp": 0,
      "packetFilterAllOthers": 0,
      "packetFilterBootpClient": 0,
      "packetFilterBootpClientIpv6": 0,
      "packetFilterBootpServer": 0,
      "packetFilterBootpServerIpv6": 0,
      "packetFilterMulticastIpv4": 0,
      "packetFilterMulticastIpv6": 0,
      "packetFilterDirection": 0,
      "lanIp": "169.254.1.1",
      "lanMask": "255.255.0.0",
      "lanGateway": "169.254.0.0",
      "diffServ": {
        "1": 0,
        "2": 0,
        "3": 0,
        "4": 4,
        "5": 4,
        "6": 4,
        "7": 4,
        "8": 0,
        "9": 0,
        "10": 0,
        "11": 0,
        "12": 4,
        "13": 4,
        "14": 4,
        "15": 4,
        "16": 0,
        "17": 0,
        "18": 0,
        "19": 0,
        "20": 4,
        "21": 4,
        "22": 4,
        "23": 4,
        "24": 0,
        "25": 0,
        "26": 0,
        "27": 0,
        "28": 4,
        "29": 4,
        "30": 4,
        "31": 4,
        "32": 0,
        "33": 0,
        "34": 0,
        "35": 0,
        "36": 4,
        "37": 4,
        "38": 4,
        "39": 4,
        "40": 0,
        "41": 0,
        "42": 0,
        "43": 0,
        "44": 4,
        "45": 4,
        "46": 4,
        "47": 4,
        "49": 0,
        "50": 0,
        "51": 0,
        "52": 4,
        "53": 4,
        "54": 4,
        "55": 4,
        "57": 0,
        "58": 0,
        "59": 0,
        "60": 4,
        "61": 4,
        "62": 4,
        "63": 4
      },
      "portFiltering": []
    },
    "location": {
      "siteInfoViewable": 1,
      "siteName": "No Site Name",
      "siteContact": "No Site Contact",
      "siteLocation": "No Site Location",
      "latitude": "+0.000000",
      "longitude": "+0.000000",
      "height": 0
    },
    "pppoeConfig": {
      "pppoeCtlPriority": 0
    },
    "snmpConfig": {
      "snmpMibPerm": 1,
      "commStringRW": "Canopy",
      "commStringROnly": "Canopyro",
      "snmpv3EngineId": "800000a1030a003e41c3a1",
      "snmpv3SecLvl": 0,
      "snmpv3AuthProt": 0,
      "snmpv3PrivProt": 0,
      "roUserName": "Canopyro",
      "roAuthPasswordEncrypted": "c56cd33e08dfd4e777b8c1759300090a",
      "roPrivPasswordEncrypted": "4707d0d082fc4f9055d2d456ac74993cd445815b998dadd32d87cecf6eda8db7",
      "rwUserEnable": 0,
      "rwUserName": "Canopy",
      "rwAuthPasswordEncrypted": "0931a4cd1c23f47e08b43aebfdf3784c",
      "rwPrivPasswordEncrypted": "2c6e48b411b2cb1b99103b22986cf88b",
      "snmpv3TrapEnable": 0,
      "snmpv2cEnable": 1,
      "trapDomainNameAppend": 0,
      "snmpPort": 161,
      "snmpTrapPort": 162,
      "snmpIpAccessFilter": [
        {
          "address": "0.0.0.0",
          "netmask": 0
        },
        {
          "address": "0.0.0.0",
          "netmask": 0
        },
        {
          "address": "0.0.0.0",
          "netmask": 0
        },
        {
          "address": "0.0.0.0",
          "netmask": 0
        },
        {
          "address": "0.0.0.0",
          "netmask": 0
        },
        {
          "address": "0.0.0.0",
          "netmask": 0
        },
        {
          "address": "0.0.0.0",
          "netmask": 0
        },
        {
          "address": "0.0.0.0",
          "netmask": 0
        },
        {
          "address": "0.0.0.0",
          "netmask": 0
        },
        {
          "address": "0.0.0.0",
          "netmask": 0
        }
      ],
      "snmpTrapAddresses": [
        "0.0.0.0",
        "0.0.0.0",
        "0.0.0.0",
        "0.0.0.0",
        "0.0.0.0",
        "0.0.0.0",
        "0.0.0.0",
        "0.0.0.0",
        "0.0.0.0",
        "0.0.0.0"
      ]
    },
    "rfSecurityConfig": {
      "encryptionConfig": 0
    },
    "smSpectrumAnalysisConfig": {
      "spectrumAnalysisOnBoot": 0
    },
    "smNatNetworkConfig": {
      "naptPublicIP": "0.0.0.0",
      "naptPublicSubnetMask": "255.255.255.0",
      "naptPublicGatewayIP": "0.0.0.0",
      "naptRFPublicIP": "0.0.0.0",
      "naptRFPublicSubnetMask": "255.255.255.0",
      "naptRFPublicGateway": "0.0.0.0",
      "naptEnable": 0,
      "arpCacheTimeout": 20,
      "tcpGarbageCollectTmout": 120,
      "udpGarbageCollectTmout": 4,
      "natTslTableSize": 2048,
      "dhcpServerEnable": 1,
      "dhcpServerLeaseTime": 30,
      "dhcpIPStart": "169.254.1.2",
      "dnsAutomatic": 1,
      "preferredDNSIP": "0.0.0.0",
      "alternateDNSIP": "0.0.0.0",
      "natDNSProxyEnable": 0,
      "dmzIP": "169.254.1.52",
      "dmzEnable": 0,
      "dhcpNumIPsToLease": 50,
      "rfDhcpState": 0,
      "natConnectionType": 1,
      "wanPingReplyEnable": 0,
      "naptRemoteManage": 0,
      "portMapping": []
    },
    "qosConfig": {
      "prioritizeTcpAck": 1,
      "largeVCQ": 0,
      "sustainedUplinkDataRate": 10000,
      "sustainedDownlinkDataRate": 10000,
      "uplinkBurstAllocation": 2500000,
      "downlinkBurstAllocation": 2500000,
      "maxUplinkDataRate": 0,
      "maxDownlinkDataRate": 0
    },
    "gpsConfig": {},
    "syslogConfig": {
      "syslogMinLevelApPreferred": 1,
      "syslogMinLevel": 6
    },
    "networkSecurityConfig": {
      "ipAccessFilterEnabled": 0,
      "ipAccessFilter": [
        {
          "address": "0.0.0.0",
          "netmask": 32
        },
        {
          "address": "0.0.0.0",
          "netmask": 32
        },
        {
          "address": "0.0.0.0",
          "netmask": 32
        }
      ]
    },
    "smVlanConfig": {
      "ingressVID": 1,
      "ingressVIDPriority": 0,
      "ingressVIDPriorityMode": 0,
      "providerVIDPriority": 0,
      "providerVIDPriorityMode": 0,
      "allowVIDAccess": 0,
      "portVids": [
        {
          "macAddress": "00-00-00-00-00-00",
          "vid": 1
        },
        {
          "macAddress": "00-00-00-00-00-00",
          "vid": 1
        },
        {
          "macAddress": "00-00-00-00-00-00",
          "vid": 1
        },
        {
          "macAddress": "00-00-00-00-00-00",
          "vid": 1
        },
        {
          "macAddress": "00-00-00-00-00-00",
          "vid": 1
        },
        {
          "macAddress": "00-00-00-00-00-00",
          "vid": 1
        },
        {
          "macAddress": "00-00-00-00-00-00",
          "vid": 1
        },
        {
          "macAddress": "00-00-00-00-00-00",
          "vid": 1
        },
        {
          "macAddress": "00-00-00-00-00-00",
          "vid": 1
        },
        {
          "macAddress": "00-00-00-00-00-00",
          "vid": 1
        }
      ]
    },
    "smPppoeConfig": {
      "pppoeEnable": 0,
      "pppoeAuthenticationType": 0,
      "pppoeAccessConcentrator": "",
      "pppoeServiceName": "",
      "pppoeUserName": "",
      "pppoePassword": "",
      "pppoeTCPMSSClampEnable": 0,
      "pppoeMTUOverrideEnable": 0,
      "pppoeMTUOverrideValue": 1492,
      "pppoeTimerType": 0,
      "pppoeTimeoutPeriod": 30
    },
    "smNetworkSecurityConfig": {
      "ethAccessEnable": 1
    },
    "vlanConfig": {
      "vlanAcceptQinQFrames": 0,
      "providerVID": 1,
      "vlanPortType": 0,
      "dynamicLearning": 1,
      "managementVID": 1,
      "managementVIDPriority": 0,
      "managementVIDPriorityMode": 0,
      "agingTimeout": 25,
      "frameType": 0,
      "priorityPrecedence": 0,
      "vlanMembership": [],
      "vlanRemark": {}
    }
  }
}

这是我正在运行的

            // register converter
            serializer.RegisterConverters(new[] { new DynamicJsonConverter() });
            dynamic obj = serializer.Deserialize(result, typeof(object));


            obj.userParameters.authenticationConfig.accounts[0].password = "testing";

最佳答案

通过包含您在上一篇文章中使用的序列化程序,我能够重现您的问题。我想出了问题所在:

That Serializer 是只读的,因为 DynamicJsonObject 类没有实现 TrySetMember 方法,因此它默认为 DynamicObject 中的基方法。因此,它不支持值的“设置”。但这很容易补救。您所要做的就是将以下方法添加到 DynamicJsonConverter.cs 文件中的 DynamicJsonObject 类:

public override bool TrySetMember(SetMemberBinder binder, object value)
{
    _dictionary[binder.Name] = value;
    return true;
}

进行更改后,我确认这可以解决问题,您将能够根据您的示例设置任何值。

关于c# - 写入动态 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38960928/

相关文章:

c# - 如何使用TableName获取特定的DataTable?

c# - Azure 函数作为 Web 角色

c# - 获取在 Instagram 上喜欢特定媒体的用户列表

java - Moshi + Retrofit - 处理 JSON 响应

Javascript:访问名称以数字开头的对象属性

css - 如何根据 Django 站点中的帐户设置创建自定义 CSS "on the fly"?

c# - AuthenticateAsServer - 根据验证程序,远程证书无效

json - 在 JSON 对象中发送数组时出错

c++ - 静态数组的行为改变了吗?

c++ - 用 char* 增加数组 [C++]