JSON.. NET更改系统的类型.对象属性自动赋给System.String

本文关键字:String System 属性 对象 NET 系统 类型 JSON | 更新日期: 2023-09-27 18:12:36

我有一个名为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对象,它的值是这样的:

  • ArgNamestring -> arg类型
  • ArgValue的类型为object {string} -> /something/more/than/a/string/

我不想要那个JSON。NET正在将其转换为System.String。如果属性类型为System.Object,则不应将其转换为字符串。

最好保持不变,并且值的类型为:JToken(或JValue)。

是否有一个JsonSerializerSettings选项来配置这个行为?

附加信息:

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

JSON.. NET更改系统的类型.对象属性自动赋给System.String

正如我在注释中所述,您想要反序列化的json字符串将被反序列化为具有两个属性的类的对象,这两个属性都是字符串类型。这是因为当您指定"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的字符串赋值在反序列化的情况下是相同的,它不涉及转换(或者更好地说强制转换),它只是装箱。

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

泛型

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; }
}

或者直接将其作为字符串传递,直到您知道要解析的类型。

相关文章: