で定義された別のプロパティ名にJSON文字列とマップのプロパティをデシリアライズまたはシリアライズ:Json.NETは、私は次のようなJSON文字列を持っているランタイム
{
"values": {
"details": {
"property1": "94",
"property2": "47",
"property3": "32",
"property4": 1
},
count: 4
}
}
私は、次のモデルにこれをマッピングするつもりです:
public class Details
{
public string property1 { get; set; }
public string property2 { get; set; }
public string property3 { get; set; }
public int property4 { get; set; }
}
public class Values
{
public Details details { get; set; }
public int count { get; set; }
}
public class RootObject
{
public Values values { get; set; }
}
JsonConvert.DeserializeObject<RootObject>(jsonString);
:
は、私はこのような、このJSON文字列をデシリアライズするとき、実行時に別の名前にこれらのプロパティ名をマッピングすることができるようにしたいです
たとえば、逆シリアル化プロセスでは、「property1」の名前を「differen_property_name1」または「differen_property_name2」または「differen_property_name3」にdeserializeします。ここで示唆したように、私は、ランタイム(私は「プロパティ1」の名前を変更する先の新しい名前)で、新しい名前を選択しています ので、私は、JsonPropertyAttributeを用いて溶液を使用することはできません。
.NET NewtonSoft JSON deserialize map to a different property name
を上記の質問の答えの1つ(Jackの答え)は、DefaultContractResolverの継承を使用しますが、その場合は機能しないようです。後で
更新
、私は、デシリアライゼーションからもらったオブジェクトをシリアル化し、実行時に定義された異なるプロパティ名にプロパティをマップする必要がありました。 ブライアンシリアル化を行うために提案されたように、私は同じ方法を使用:
私は私の新しいプロパティ名をマッピングするために辞書を使用:
var map = new Dictionary<Type, Dictionary<string, string>>
{
{
typeof(Details),
new Dictionary<string, string>
{
{"property1", "myNewPropertyName1"},
{"property2", "myNewPropertyName2"},
{"property3", "myNewPropertyName3"},
{"property4", "myNewPropertyName4"}
}
}
};
、その後、私はこのようなオブジェクトをシリアル化するためにブライアンのDynamicMappingResolverを使用: var settings = new JsonSerializerSettings
{
ContractResolver = new DynamicMappingResolver(map)
};
var root = JsonConvert.SerializeObject(myObjectInstance, settings);
を私はプロパティに与えたいた新しい名前ランタイムで決定したいとJsonPropertyAttributeであなたが「ハードコード」の名前を使用する必要があるため。 –
片方向(醜いかもしれませんが)は、最初にJSONを逆シリアル化し、逆シリアル化されたオブジェクトを新しい名前のオブジェクトにマップすることです。しかし、よりエレガントな方法があるかもしれません。 – Tim
@Tim、実行時に新しい名前を定義する必要がある場合、どのように新しい名前のオブジェクトに逆シリアル化されたオブジェクトをマップしますか? –