JSONファイルから生成されたJsonPropertyName = nameを使用して、対応するC#クラスの単一の要素にアクセスするにはどうすればよいですか?

RogerM

(生成された)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

dbc

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);

ノート:

ここでデモフィドル

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ