简体   繁体   中英

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

I have:

[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);
        }

Failing here:

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

serialized variable during debugging:

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

notice there is no quotation mark after "adDomainConfiguration": and this is cause a problem.

image1

adDomainConfiguration is dynamic ie it can have different fields with different types.

I need it as an object not as a String in order to pass it as an object in API response:

image2

There is a bug in the code. Since Newtonsoft.Json using a constructor to deserilize json, adDomainConfiguration input parameter should JObject, not a string

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

and you have to init it this way


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));

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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