Pat*_*jer 5 c# json decoding json.net
我正在解码的类使用字符串字段,Newtonsoft默认解码器将json文件中的布尔值转换为大写字符串。它可能会调用布尔类型的ToString(),结果为“ True”或“ False”。
void Main()
{
var foo = JsonConvert.DeserializeObject<Foo>("{Prop:true}");
Console.WriteLine(foo.Prop); // output: True, desired output: true
}
public class Foo
{
public string Prop{get;set;}
}
Run Code Online (Sandbox Code Playgroud)
由于该字段在json中可以是字符串或布尔值,因此我希望有一个自定义解码器,该解码器始终根据值将json-boolean转换为“ true”或“ false”。
任何帮助,将不胜感激。
像这样的事情怎么样:
class BoolStringConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (typeof(string) == objectType);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JToken token = JToken.Load(reader);
string str = token.Value<string>();
if (string.Equals("true", str, StringComparison.OrdinalIgnoreCase) ||
string.Equals("false", str, StringComparison.OrdinalIgnoreCase))
{
str = str.ToLower();
}
return str;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)
演示:
class Program
{
static void Main(string[] args)
{
string json = @"
{
""Bool1"": true,
""Bool2"": ""TRUE"",
""Bool3"": false,
""Bool4"": ""FALSE"",
""Other"": ""Say It Isn't True!""
}";
Foo foo = JsonConvert.DeserializeObject<Foo>(json, new BoolStringConverter());
Console.WriteLine("Bool1: " + foo.Bool1);
Console.WriteLine("Bool2: " + foo.Bool2);
Console.WriteLine("Bool3: " + foo.Bool3);
Console.WriteLine("Bool4: " + foo.Bool4);
Console.WriteLine("Other: " + foo.Other);
}
}
class Foo
{
public string Bool1 { get; set; }
public string Bool2 { get; set; }
public string Bool3 { get; set; }
public string Bool4 { get; set; }
public string Other { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
输出:
Bool1: true
Bool2: true
Bool3: false
Bool4: false
Other: Say It Isn't True!
Run Code Online (Sandbox Code Playgroud)