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”后没有引号:这会导致问题。

image1

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

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

image2

代码中存在错误。由于 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));