我有一个名为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
)正确转换。
答案 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; }
}
或简单地将整个字符串作为字符串传递,直到您知道将要解析的类型为止。