我有一个名为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
->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字符串将被反序列化为具有两个属性的类的对象,这两个属性都是字符串类型。这是因为当您指定"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; }
}
或者直接将其作为字符串传递,直到您知道要解析的类型。