次のような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コンストラクターを提供して希望どおりに解析する方法はありますか?私は自分のパーサーを書かないようにしているだけです。多分それは必要ではありません。
これは、JSONを変更せずに、小さなカスタムJsonConverter
を使用してコンストラクターの呼び出し方法を指示するJson.Netで実行できます。
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
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加