ServiceStack.Text json反序列化会创建错误的对象,而不是抛出无效的json输入字符串

ssn*_*ssn 14 c# json servicestack

当我尝试反序列化这个无效的json字符串(最后}]遗漏):

[{"ExtId":"2","Name":"VIP sj?lland","Mobiles":["4533333333","4544444444"]
Run Code Online (Sandbox Code Playgroud)

通过做这个:

var result = JsonSerializer.DeserializeFromString<T>(str);    
Run Code Online (Sandbox Code Playgroud)

ServiceStack json反序列化器接受该字符串,但它创建了一个错误的对象,因为我最终得到了一个具有以下值的C#对象:

ExtId : "2"                                      // ok fine.
Name: "VIP sj?lland"                            // ok fine
Mobiles: ["4533333333","4544444444", "544444444"]// Aarg! An array with 3 objects ?!? 
                                                 // There were only two in the JSON string.
Run Code Online (Sandbox Code Playgroud)

在这种情况下,抛出异常而不是继续使用坏数据会好得多.因此我尝试使用:

JsConfig.ThrowOnDeserializationError = true; 
Run Code Online (Sandbox Code Playgroud)

就在调用DeserializeFromString之前,但没有抛出任何异常.在1月份,我问这个问题配置ServiceStack.Text以抛出无效的JSON,答案是ServiceStack支持resrence并且我可以在GitHub中发出pull请求.

这仍然是这样吗?有没有人已经做过,省了我的麻烦?否则,我的时间表非常紧张,所以如果有人有一些代码或建议如何创建一个选项标志以使ServiceStack抛出反序列化错误,请回复此处,以便我可以更快地完成此操作.

Mar*_*gus 0

C# 对于 JSON 有点挑剔。以下将是有效的!注意我没有匿名对象数组作为默认元素。

\n\n
{\n    "ExtItem": [\n        {\n            "ExtId": "2",\n            "Name": "VIPsj\xef\xbf\xbdlland",\n            "Mobiles": [\n                "4533333333",\n                "4544444444"\n            ]\n        }\n    ]\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我从中生成 POCO 我得到

\n\n
public class Rootobject\n{\n    public Extitem[] ExtItem { get; set; }\n}\n\npublic class Extitem\n{\n    public string ExtId { get; set; }\n    public string Name { get; set; }\n    public string[] Mobiles { get; set; }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我个人使用扩展方法来字符串

\n\n
public static class Extensions\n{\n    public  static bool DeserializeJson<T>(this String str, out T item)\n    {\n        item = default(T);\n        try\n        {\n            item = new JavaScriptSerializer().Deserialize<T>(str);\n            return true;\n        }\n        catch (Exception ex)\n        {\n            return false;\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这将使我能够写:

\n\n
Rootobject ext;\nconst string validJson = @"\n{\n    ""ExtItem"": [\n        {\n            ""ExtId"":""2"",\n            ""Name"":""VIPsj\xef\xbf\xbdlland"",\n            ""Mobiles"":[\n                ""4533333333"",\n                ""4544444444""\n            ]\n        }\n    ]\n}";\nif (validJson.DeserializeJson(out ext))\n{ //valid input \n    // following would print 2 elements : 4533333333, 4544444444\n    Console.WriteLine(string.Join(", ", ext.ExtItem.First().Mobiles)); \n} //invalid input\n
Run Code Online (Sandbox Code Playgroud)\n