C# Newtonsoft JSON:序列化使用相同的输入生成不同的输出
我正在从类输入生成一个JSON字符串。我不知道为什么,但是…它生成不同的输出(不同的项目),但是使用相同的输入(从Web服务引用生成的类)。i、 e: 第一个项目产生:C# Newtonsoft JSON:序列化使用相同的输入生成不同的输出,c#,json,serialization,json.net,C#,Json,Serialization,Json.net,我正在从类输入生成一个JSON字符串。我不知道为什么,但是…它生成不同的输出(不同的项目),但是使用相同的输入(从Web服务引用生成的类)。i、 e: 第一个项目产生: "{\"authToken\":{\"Token\":\"4f49f29e951d8d4f7e5b1f26aaf924771c9ed5fdfe6a23021d6720f2f5deead7==\",\"UserInfo\":{\"Email\":\"YS00982@mail.com\",\"Locked\":false,\"Pho
"{\"authToken\":{\"Token\":\"4f49f29e951d8d4f7e5b1f26aaf924771c9ed5fdfe6a23021d6720f2f5deead7==\",\"UserInfo\":{\"Email\":\"YS00982@mail.com\",\"Locked\":false,\"Phone\":null,\"UserLogin\":\"YS00982\",\"UserName\":\"YS00982 \"}},\"interactionModel\":{\"Description\":\"description\",\"Solicitor\":\"ry13578\",\"Title\":\"title\",\"Urgency\":\"3\"}}"
"{\r\n \"authToken\": {\r\n \"token\": \"4f49f29e951d8d4f7e5b1f26aaf924771c9ed5fdfe6a23021d6720f2f5deead7==\",\r\n \"userInfo\": {\r\n \"email\": \"YS00982@mail.com\",\r\n \"locked\": false,\r\n \"userLogin\": \"YS00982\",\r\n \"userName\": \"YS00982 \"\r\n }\r\n },\r\n \"interactionModel\": {\r\n \"description\": \"description\",\r\n \"solicitor\": \"ry13578\",\r\n \"title\": \"title\",\r\n \"urgency\": \"3\"\r\n }\r\n}"
第二个项目产生:
"{\"authToken\":{\"Token\":\"4f49f29e951d8d4f7e5b1f26aaf924771c9ed5fdfe6a23021d6720f2f5deead7==\",\"UserInfo\":{\"Email\":\"YS00982@mail.com\",\"Locked\":false,\"Phone\":null,\"UserLogin\":\"YS00982\",\"UserName\":\"YS00982 \"}},\"interactionModel\":{\"Description\":\"description\",\"Solicitor\":\"ry13578\",\"Title\":\"title\",\"Urgency\":\"3\"}}"
"{\r\n \"authToken\": {\r\n \"token\": \"4f49f29e951d8d4f7e5b1f26aaf924771c9ed5fdfe6a23021d6720f2f5deead7==\",\r\n \"userInfo\": {\r\n \"email\": \"YS00982@mail.com\",\r\n \"locked\": false,\r\n \"userLogin\": \"YS00982\",\r\n \"userName\": \"YS00982 \"\r\n }\r\n },\r\n \"interactionModel\": {\r\n \"description\": \"description\",\r\n \"solicitor\": \"ry13578\",\r\n \"title\": \"title\",\r\n \"urgency\": \"3\"\r\n }\r\n}"
有两个主要区别:第一个字符中的大写字母(token vs token)和添加到我的json中的“\r\n”
好吧,我没有在Newtonsoft中配置任何东西,所以我不知道为什么它在每个项目中都以不同的方式运行。有人知道原因吗
示例代码:
JsonConvert.DefaultSettings = () => new JsonSerializerSettings()
{
ContractResolver = new CamelCasePropertyNamesContractResolver(),
Formatting = Formatting.Indented,
NullValueHandling = NullValueHandling.Ignore,
};
HttpClient client = new HttpClient();
client.BaseAddress = new Uri("https://ws.domain.com/BackEndService/");
StringContent c = new StringContent($"{{ \"userLogin\": \"YS00982\", \"password\": \"pass\"}}", Encoding.UTF8, "application/json");
HttpResponseMessage r = await client.PostAsync("service.svc/Authenticate", c);
string d = await r.Content.ReadAsStringAsync();
string token = string.Empty;
D authres = JsonConvert.DeserializeObject<D>(d);
if (authres.d.success)
{
AuthToken authToken = new AuthToken();
authToken = authres.d.Data;
var model = new InteractionModel
{
Description = "description",
Title = "title",
Solicitor = "ry13578",
Urgency = "3"
};
object obj = new
{
authToken = authToken,
interactionModel = model
};
string json = JsonConvert.SerializeObject(obj, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None, ContractResolver = null });
Console.WriteLine(json);
StringContent cc = new StringContent(json, Encoding.UTF8, "application/json");
r = await client.PostAsync("CAUMobileService.svc/CreateInteraction", cc);
d = await r.Content.ReadAsStringAsync();
Console.WriteLine(d);
}
JsonConvert.DefaultSettings=()=>newjsonserializersettings()
{
ContractResolver=新的CamelCasePropertyNamesContractResolver(),
格式化=格式化。缩进,
NullValueHandling=NullValueHandling.Ignore,
};
HttpClient=新的HttpClient();
client.BaseAddress=新Uri(“https://ws.domain.com/BackEndService/");
StringContent c=新的StringContent($“{{\“userLogin\”:\“YS00982\”,“password\”:\“pass\”}),Encoding.UTF8,“application/json”);
HttpResponseMessage r=wait client.PostAsync(“service.svc/Authenticate”,c);
字符串d=wait r.Content.ReadAsStringAsync();
string-token=string.Empty;
D authres=JsonConvert.DeserializeObject(D);
if(authres.d.success)
{
AuthToken AuthToken=新的AuthToken();
authToken=authres.d.Data;
var模型=新的交互模型
{
Description=“Description”,
Title=“Title”,
律师=“ry13578”,
紧急程度=“3”
};
对象obj=新
{
authToken=authToken,
交互模型
};
字符串json=JsonConvert.SerializeObject(obj,新JsonSerializerSettings{NullValueHandling=NullValueHandling.Ignore,Formatting=Formatting.None,ContractResolver=null});
Console.WriteLine(json);
StringContent cc=newstringcontent(json,Encoding.UTF8,“application/json”);
r=wait client.PostAsync(“CAUMobileService.svc/CreateInteraction”,cc);
d=wait r.Content.ReadAsStringAsync();
控制台写入线(d);
}
向您致意您似乎正在使用两个单独的JsonSerializerSettings实例。默认设置配置为通过ContractResolver使用驼峰式套管:
JsonConvert.DefaultSettings = () => new JsonSerializerSettings()
{
ContractResolver = new CamelCasePropertyNamesContractResolver(),
Formatting = Formatting.Indented,
NullValueHandling = NullValueHandling.Ignore,
};
string json = JsonConvert.SerializeObject(obj, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None, ContractResolver = null });
第二个实例未指定ContractResolver:
JsonConvert.DefaultSettings = () => new JsonSerializerSettings()
{
ContractResolver = new CamelCasePropertyNamesContractResolver(),
Formatting = Formatting.Indented,
NullValueHandling = NullValueHandling.Ignore,
};
string json = JsonConvert.SerializeObject(obj, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None, ContractResolver = null });
承包商分解器是控制套管的地方。格式化=格式化。无将消除JSON中的换行符。您似乎正在使用两个单独的JsonSerializerSettings实例。默认设置配置为通过ContractResolver使用驼峰式套管:
JsonConvert.DefaultSettings = () => new JsonSerializerSettings()
{
ContractResolver = new CamelCasePropertyNamesContractResolver(),
Formatting = Formatting.Indented,
NullValueHandling = NullValueHandling.Ignore,
};
string json = JsonConvert.SerializeObject(obj, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None, ContractResolver = null });
第二个实例未指定ContractResolver:
JsonConvert.DefaultSettings = () => new JsonSerializerSettings()
{
ContractResolver = new CamelCasePropertyNamesContractResolver(),
Formatting = Formatting.Indented,
NullValueHandling = NullValueHandling.Ignore,
};
string json = JsonConvert.SerializeObject(obj, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None, ContractResolver = null });
承包商分解器是控制套管的地方。格式化=格式化。没有一个会消除JSON中的换行符。我建议将每个项目简化为一个-一旦您有两段代码,您希望它们的行为相同,我们就可以更好地解释这些差异。如果您提供实际的JSON,而不是字符串的调试器转义版本,这也会有所帮助。而且,在这两个项目中,我都使用相同的代码,没有任何更改。我在想这是否是Newtonsoft配置。是的,我是说不要从调试器中复制它,因为我们看到的是转义版本而不是实际字符串。我强烈怀疑,虽然您正在查看的代码是相同的,但在其他地方存在差异。。。如果您通过逐渐删除不相关的部分(和硬编码数据)将每个项目简化为一个项目,您将发现这种差异。没有看到你的任何代码,我们基本上没有机会帮助你。谢谢@JonSkeet,我将添加两个项目的代码。你对此有实际问题吗?因为它们看起来兼容/可互换。写一个(2x)。并详细说明平台、Newtonsoft软件包的版本等。我建议将每个项目简化为一个-一旦您有两段代码,您希望它们的行为相同,我们就可以更好地解释这些差异。如果您提供实际的JSON,而不是字符串的调试器转义版本,这也会有所帮助。而且,在这两个项目中,我都使用相同的代码,没有任何更改。我在想这是否是Newtonsoft配置。是的,我是说不要从调试器中复制它,因为我们看到的是转义版本而不是实际字符串。我强烈怀疑,虽然您正在查看的代码是相同的,但在其他地方存在差异。。。如果您通过逐渐删除不相关的部分(和硬编码数据)将每个项目简化为一个项目,您将发现这种差异。没有看到你的任何代码,我们基本上没有机会帮助你。谢谢@JonSkeet,我将添加两个项目的代码。你对此有实际问题吗?因为它们看起来兼容/可互换。写一个(2x)。并详细介绍了平台、Newtonsoft软件包的版本等。是的,我修改了这一行,因为我需要删除新行。现在,我不知道如何“覆盖”CamelCasePropertyNameContractResolver。请尝试为Pascal大小写设置ContractResolver=new DefaultContractResolver()。是的,我修改了那一行,因为我需要删除换行符。现在,我不知道如何“覆盖”CamelCasePropertyNameContractResolver。请尝试设置ContractResolve