我们假设我有一个类似于这样的JSON字符串:
{
"a" : "1",
"b" : "string",
"c" : ["1994-11-05T08:15:30-05:00 Text1. Text2.",
"1993-12-03T08:15:30-05:00 Text1b. Text2b."]
}
我想解析它:
class A
{
int a;
string b;
List<CustomObjects> c;
}
class CustomObject
{
DateTime date;
string text1;
string text2;
void CustomObject(string constructString)
{
// parsing constructString into object fields
}
}
有没有办法可以使用像JSON.NET这样的C#JSON解析器,并提供CustomObject构造函数来按我想要的方式解析它? 我只是想避免编写自己的解析器。也许没有必要。
答案 0 :(得分:0)
如果你像这样修改你的json,你可以使用JsonConstructor
属性:
{
"a":"1",
"b":"string",
"c":[
{
"constructString":"1994 -11-05T08:15:30-05:00 Text1. Text2."
},
{
"constructString":"1993-12-03T08:15:30-05:00 Text1b. Text2b."
}
]
}
然后CustomObject的构造函数将如下所示:
[JsonConstructor]
CustomObject(string constructString)
{
// parsing constructString into object fields
}
解析:
var aObj = JsonConvert.DeserializeObject<A>(json);
答案 1 :(得分:0)
这可以与Json.Net一起使用,而不需要对JSON进行任何更改,使用小的自定义JsonConverter
来告诉它如何调用构造函数:
class ConstructFromStringConverter : JsonConverter
{
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
ConstructorInfo ctor = objectType.GetConstructor(new Type[] { typeof(string) });
if (ctor != null)
{
return ctor.Invoke(new object[] { (string)reader.Value });
}
throw new JsonException(objectType.Name + " does not have a public constructor that accepts a string.");
}
public override bool CanWrite
{
get { return false; }
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override bool CanConvert(Type objectType)
{
return false;
}
}
要将转换器与CustomObject
课程一起使用,您只需要在其上添加[JsonConverter]
属性,如下所示:
[JsonConverter(typeof(ConstructFromStringConverter))]
class CustomObject
{
...
}
然后,您可以通常的方式反序列化您的JSON,它将“正常工作”:
A a = JsonConvert.DeserializeObject<A>(json);
这是一个有效的演示:https://dotnetfiddle.net/md2hH6