簡體   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