【问题标题】:JSON string is unexpectedly deserialized into object as a listJSON 字符串意外反序列化为对象作为列表
【发布时间】:2014-03-21 15:13:49
【问题描述】:

这个 JSON:

{
    "Values": {
        "Category": "2",
        "Name": "Test",
        "Description": "Testing",
        "Expression": "[Total Items] * 100"
    }
}

正在使用 JsConfig.ConvertObjectTypesIntoStringDictionary = true; 反序列化到此 DTO:

public class MyDto {
    public Dictionary<string, object> Values { get; set; }
}

出乎意料的是,Expression 属性被反序列化为List&lt;object&gt;,而不是string(见截图)。

解析器似乎看到了左括号并尝试将值解释为数组。有什么方法可以关闭这种“类型检测”,或者以其他方式解决问题(不更改 DTO)?

我正在使用 ServiceStack v3.9.71。

【问题讨论】:

  • 您是否尝试过逃避刹车,即“\[Total
  • 比这更简单:只要第一个字符不是[,它就可以正常工作。

标签: c# json servicestack deserialization json-deserialization


【解决方案1】:

Json.NET 能够将您的示例 JSON 反序列化为您的 DTO 类的实例。您使用的 JSON 解析库似乎有问题。能换吗?

internal class Program
{
    private static void Main()
    {
        const string json = @"{
""Values"": {
    ""Category"": ""2"",
    ""Name"": ""Test"",
    ""Description"": ""Testing"",
    ""Expression"": ""[Total Items] * 100""
    }
}";
        var myDto = JsonConvert.DeserializeObject<MyDto>(json);
    }
}
public class MyDto
{
    public Dictionary<string, object> Values
    {
        get;
        set;
    }
}

编辑:

我将代码切换为使用来自 NuGet 的 ServiceStack.Text,并且我能够使序列化工作完美:

var myDto = JsonSerializer.DeserializeFromString&lt;MyDto&gt;(json);

【讨论】:

  • 除非 ServiceStack 的 JSON 序列化程序是可插入的(我不确定),否则我无法切换。
  • 我在没有JsConfig.ConvertObjectTypesIntoStringDictionary = true; 的情况下再次尝试了它,它成功了。我已经在我的项目中使用该设置很长时间了,但不记得添加它的动机。我会尝试删除它一段时间,看看会发生什么。感谢您的帮助。
  • 有趣。这样就可以了。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
  • 2014-01-04
  • 2020-02-03
  • 1970-01-01
  • 2012-04-24
  • 1970-01-01
相关资源
最近更新 更多