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));
我有:
[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));