【问题标题】:Newtonsoft.Json.JsonReaderException: Unexpected character encountered while parsing on JsonConvert.DeserializeObject after JsonConvert.SerializeObjectNewtonsoft.Json.JsonReaderException:在 JsonConvert.SerializeObject 之后解析 JsonConvert.DeserializeObject 时遇到意外字符
【发布时间】:2022-01-19 00:20:50
【问题描述】:

我有:

[JsonObject(NamingStrategyType = typeof(CamelCaseNamingStrategy))]
    public class AdDomainModel
    {
        [JsonConstructor]
        public AdDomainModel(
            Guid organizationId,
            string domainName,
            string adDomainConfiguration
            )
        {
            AdDomainConfiguration = JObject.Parse(adDomainConfiguration);
            DomainName = domainName;
            OrganizationId = organizationId;
        }

        // Properties

        public Guid OrganizationId
        {
            get; set;
        }

        public String DomainName
        {
            get;
        }

        public JObject AdDomainConfiguration
        {
            get;
        }
    }

private static readonly Guid OrganizationId = Guid.NewGuid();
private static readonly string DomainName = "some.domain";
private static readonly string AdDomainConfiguration = $@"
    {{
        ""preferredDC"":""new.newdomain.name"",
        ""collectEnabledUsersOnly"":""true""
    }}";

[TestMethod]
        public void AdDomainModel_SerializationTest()
        {
var _adDomainModel = new AdDomainModel(
                OrganizationId,
                DomainName,
                AdDomainConfiguration
                );
            var serialized = JsonConvert.SerializeObject(_adDomainModel);
            var deserialized = JsonConvert.DeserializeObject<AdDomainModel>(serialized);

            Assert.AreEqual(_adDomainModel.DomainName, deserialized.DomainName);
            Assert.AreEqual(_adDomainModel.AdDomainConfiguration, deserialized.AdDomainConfiguration);
            Assert.AreEqual(_adDomainModel.OrganizationId, deserialized.OrganizationId);
        }

在这里失败:

var deserialized = JsonConvert.DeserializeObject<AdDomainModel>(serialized);

调试过程中的序列化变量:

{"organizationId":"14ca4438-abff-48cf-9b86-57492217b08e","domainName":"some.domain","adDomainConfiguration":{"preferredDC":"new.newdomain.name","collectEnabledUsersOnly" :"真"}}

注意“adDomainConfiguration”后面没有引号:这是导致问题的原因。

image1

adDomainConfiguration 是动态的,即它可以有不同类型的不同字段。

我需要它作为对象而不是字符串,以便在 API 响应中将其作为对象传递:

image2

【问题讨论】:

    标签: c# json serialization


    【解决方案1】:

    代码中存在错误。由于Newtonsoft.Json使用构造函数对json进行反序列化,所以adDomainConfiguration入参应该是JObject,而不是字符串

    [JsonConstructor]
        public AdDomainModel(
            Guid organizationId,
            string domainName,
            JObject adDomainConfiguration
            )
        {
            AdDomainConfiguration = adDomainConfiguration;
            DomainName = domainName;
            OrganizationId = organizationId;
        }
    

    你必须以这种方式初始化它

    
    private static readonly Guid OrganizationId = Guid.NewGuid();
    private static readonly string DomainName = "some.domain";
    private static readonly string AdDomainConfiguration = @"
    {
            ""preferredDC"":""new.newdomain.name"",
            ""collectEnabledUsersOnly"":""true""
    }";
    
    var _adDomainModel = new AdDomainModel(OrganizationId, DomainName, 
    JObject.Parse(AdDomainConfiguration));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-05
      • 2014-06-09
      • 2016-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多