简体   繁体   English

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

[英]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 _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"}} {"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.注意“adDomainConfiguration”后面没有引号:这是导致问题的原因。

image1图像1

adDomainConfiguration is dynamic ie it can have different fields with different types. adDomainConfiguration 是动态的,即它可以有不同类型的不同字段。

I need it as an object not as a String in order to pass it as an object in API response:我需要它作为 object 而不是字符串,以便在 API 响应中将其作为 object 传递:

image2图2

There is a bug in the code.代码中有一个错误。 Since Newtonsoft.Json using a constructor to deserilize json, adDomainConfiguration input parameter should JObject, not a string由于 Newtonsoft.Json 使用构造函数对 json 进行反序列化,所以 adDomainConfiguration 输入参数应该是 JObject,而不是字符串

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

暂无
暂无

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

相关问题 Newtonsoft.Json.JsonReaderException:&#39;解析值时遇到意外字符:[。 - Newtonsoft.Json.JsonReaderException: 'Unexpected character encountered while parsing value: [. Newtonsoft.Json.JsonReaderException:'解析值时遇到意外字符: - Newtonsoft.Json.JsonReaderException: 'Unexpected character encountered while parsing value: Newtonsoft.Json.JsonReaderException: '解析值时遇到意外字符 - Newtonsoft.Json.JsonReaderException: 'Unexpected character encountered while parsing value JsonConvert.SerializeObject 后跟 JsonConvert.DeserializeObject 抛出 InvalidCastException - JsonConvert.SerializeObject followed by JsonConvert.DeserializeObject throws InvalidCastException 使用 JSON.net(JsonConvert.SerializeObject 或 JsonConvert.DeSerializeObject)为缺少的复杂属性设置默认值 - Set Default value for missing Complex properties with JSON.net (JsonConvert.SerializeObject or JsonConvert.DeSerializeObject) JSon.Net JObject.FromObject Vs JsonConvert.DeserializeObject <JObject>(JsonConvert.SerializeObject(obj)); - JSon.Net JObject.FromObject Vs JsonConvert.DeserializeObject<JObject>(JsonConvert.SerializeObject(obj)); 错误 Newtonsoft.Json.JsonReaderException:&#39;解析值时遇到意外字符:S. 路径&#39;&#39;,第 0 行,位置 0。 - Error Newtonsoft.Json.JsonReaderException: 'Unexpected character encountered while parsing value: S. Path '', line 0, position 0.' 未处理的异常。 Newtonsoft.Json.JsonReaderException:解析值时遇到意外字符:[。 路径“数据”,第 1 行,position 19 - Unhandled exception. Newtonsoft.Json.JsonReaderException: Unexpected character encountered while parsing value: [. Path 'data', line 1, position 19 Newtonsoft.Json.JsonReaderException: Unexpected character encountered while parsing value: S. Path '', line 0, position 0. 仅在特定版本上 - Newtonsoft.Json.JsonReaderException: Unexpected character encountered while parsing value: S. Path '', line 0, position 0. Only on certain build 为什么是JsonConvert.DeserializeObject <T> 抛出JsonReaderException吗? - Why is JsonConvert.DeserializeObject<T> throwing a JsonReaderException?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM