繁体   English   中英

Newtonsoft.Json.JsonReaderException:在 JsonConvert.SerializeObject 之后解析 JsonConvert.DeserializeObject 时遇到意外字符

[英]Newtonsoft.Json.JsonReaderException: Unexpected character encountered while parsing on JsonConvert.DeserializeObject after JsonConvert.SerializeObject

我有:

[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":"true "}}

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

图像1

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

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

图2

代码中有一个错误。 由于 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));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM