C#使用自定义构造函数将一个json字段解析为一个对象

时间:2017-07-21 19:03:51

标签: c# json parsing constructor

我们假设我有一个类似于这样的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构造函数来按我想要的方式解析它? 我只是想避免编写自己的解析器。也许没有必要。

2 个答案:

答案 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