Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Newtonsoft JSON:序列化使用相同的输入生成不同的输出_C#_Json_Serialization_Json.net - Fatal编程技术网

C# Newtonsoft JSON:序列化使用相同的输入生成不同的输出

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

我正在从类输入生成一个JSON字符串。我不知道为什么,但是…它生成不同的输出(不同的项目),但是使用相同的输入(从Web服务引用生成的类)。i、 e:

第一个项目产生:

"{\"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