JSON.NET自动将System.Object属性的类型更改为System.String

时间:2016-10-10 13:06:48

标签: c# json json.net deserialization

我有一个名为Arg的班级。 属性ArgValue属于System.Object类型。

public class Arg
{
    public string ArgName { get; set; }
    public object ArgValue { get; set; }
}

如果我想反序列化这样的JSON字符串:

string json = @"{""ArgName"":""arg"",""ArgValue"":""/something/more/than/a/string/""}";

var jsonSerializerSettings = new JsonSerializerSettings() { };

Arg arg = JsonConvert.DeserializeObject<Arg>(json, jsonSerializerSettings);

我得到的Arg对象的值如下:

  • ArgName的类型为string - &gt; arg
  • ArgValue的类型为object {string} - &gt; /something/more/than/a/string/

我不希望JSON.NET将其转换为System.String。 如果属性的类型为System.Object,则不应将其转换为字符串。

最好保持不变,价值为: JToken (或 JValue )。

是否有JsonSerializerSettings选项来配置此行为?

其他信息:

属性ArgValue中的字符串值是“不仅仅是一个字符串”,我需要稍后自己转换它。 JsonConverter不能在这里使用,因为此时我不知道对象的具体类型。后来我知道并且需要使用JToken.ToObject<MySpecialType>()。 (它被JsonConverter)正确转换。

2 个答案:

答案 0 :(得分:2)

正如我在评论中所述,要反序列化的json字符串将被反序列化为具有两个属性的类的对象,这两个属性都是string类型。这是因为当您指定"ArgName" : "arg" arg之间的两个引号时,标记字符串类型的值。这也是ArgValue的情况,它也被串行化为字符串。

通过这行代码:

Arg arg = JsonConvert.DeserializeObject<Arg>(json, jsonSerializerSettings);

您收到arg类型的对象(Arg),它与Arg类型的经典对象完全相同。这相当于:

Arg arg = new Arg{ ArgName = "arg", ArgValue = "/something/more/than/a/string/" };

对于期望对象的属性ArgValue的字符串赋值在反序列化的情况下是相同的,它不涉及转换(或者更好地说 cast ),它只是{{ 3}}

答案 1 :(得分:1)

对于以后的转换,您可以使用

泛型

public class Arg<T>
{
    public string ArgName { get; set; }
    public T ArgValue { get; set; }
}

然后您可以按如下方式传递目标类型:

JsonConvert.DeserializeObject<Arg<Qualifiedname>>(somestring);

public Arg<T> Deserialize<T>(string somestring){
  return JsonConvert.DeserializeObject<Arg<T>>(somestring);
}

将其保留为JToken

public class Arg
{
    public string ArgName { get; set; }
    public JToken ArgValue { get; set; }
}

稍后使用JsonConvert

对其进行反序列化
public class Arg
{
    public string ArgName { get; set; }
    public string ArgValue { get; set; }
}

或简单地将整个字符串作为字符串传递,直到您知道将要解析的类型为止。