(生成された)JsonProperty Name = JSONファイルの名前を使用して、対応するC#クラスの単一の要素にアクセスするにはどうすればよいですか?これが私がやろうとしていることです…
JSONファイルをC#クラスにロードするXamarinの「クラシック」NewtonsoftアプリケーションがありますMagicTime
。
これが私のクラスの最初の部分です-これは私のJSONファイルを使用してnewtonsoftWebサイトによって自動的に生成されました
public partial class MagicTime
{
[JsonProperty("Accel Delay")]
public long AccelDelay { get; set; }
[JsonProperty("Accel Period")]
public long AccelPeriod { get; set; }
[JsonProperty("Alt DT Step")]
public long AltDtStep { get; set; }
[JsonProperty("Beep On Command")]
public bool BeepOnCommand { get; set; }
[JsonProperty("Bunt Step")]
public long BuntStep { get; set; }
[JsonProperty("Bunt Timeout")]
これは、loadpがJSONファイルのコンテンツを含む文字列変数であるインスタントをロード/デシリアライズする方法です。
MagicTime MT = JsonConvert.DeserializeObject<MagicTime>(loadp );
これは正常に機能します。アプリケーションでは、いくつかのデータ要素の値を変更します。たとえば、上記を見てください– MT.AccelDelay = 21;
次に、プロセスを逆にして、/ SerializeIを書きます。
それもうまくいきます。
これで、JsonProperty名を使用して対応するC#データ項目にアクセスするという新しい要件があります。
上記の例を使用[JsonProperty("Accel Delay")]
して、対応するc#要素にアクセスしますMT.AccelDelay
。
JObject
これを行うためにJSON文字列が読み込まれる例を見てきましたが、ない場合は見ていません(私が見ることができます)JObject
NewtonsoftContractResolver
は、Json.NETがc#オブジェクトからJSONオブジェクトにマップする方法を定義するため、この目的に使用できます。
まず、次の拡張メソッドを定義します。
public static partial class JsonExtensions
{
static readonly IContractResolver defaultResolver = new JsonSerializer().ContractResolver;
public static T GetJsonPropertyValue<T>(object obj, string propertyName, IContractResolver resolver = null)
{
resolver = resolver ?? defaultResolver;
var contract = resolver.ResolveContract(obj.GetType());
if (contract is JsonObjectContract objectContract)
{
var property = objectContract.Properties.GetClosestMatchProperty(propertyName);
if (property == null)
throw new JsonException(string.Format("Unknown property {0}", propertyName));
return (T)property.ValueProvider.GetValue(obj);
}
throw new JsonException(string.Format("Invalid contract {0}", contract));
}
}
そして今、あなたはできる:
var accelDelay = JsonExtensions.GetJsonPropertyValue<long>(MT, "Accel Delay");
事前にタイプがわからない場合は、次のようにすることができます。
var accelDelay = JsonExtensions.GetJsonPropertyValue<object>(MT, "Accel Delay");
キャメルケースを使用している場合は、次のようにします。
var resolver = new CamelCasePropertyNamesContractResolver();
var accelDelay = JsonExtensions.GetJsonPropertyValue<object>(MT, "Accel Delay", resolver);
ノート:
着信obj
がJSONオブジェクト以外のもの(配列やプリミティブなど)にマップされる場合、GetJsonPropertyValue()
例外がスローされます。プロパティが設定のみの場合もスローされます。
特定のタイプのすべてのJSONプロパティ名を検出する方法が必要な場合は、クエリ文字列で使用するクラスからJSONプロパティ名のリストを取得する、特にこの回答を参照してください。
ここでデモフィドル。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加