非推奨になっているため、の使用はお勧めしJavaScriptSerializer
ません。サードパーティのソリューションが必要な場合は、JSON.Net
私が聞いたところによるとかなり良いです。
ただし、私は依存関係について奇妙な人なので、依存関係がまだ存在しない場合は、通常、自分でロールします。DataContractJsonSerializer
幸いなことに、これはSystem.Runtime.Serialization
名前空間によるものでそれほど難しくはありません。
あなたがする必要があるのは、最初にネストされた方法ですべてのオブジェクトを定義することです:
using System.Reflection;
using System.Runtime.Serialization; // You will have to add a reference
using System.Runtime.Serialization.Json; // to System.Runtime.Serialization.dll
[DataContract]
public class AddressInfo
{
[DataMember(Name = "address")]
public string Address { get; set; }
[DataMember(Name = "version")]
public int Version { get; set; }
}
[DataContract]
public class AddressList
{
[DataMember(Name = "public")]
public IEnumerable<AddressInfo> Public { get; set; }
[DataMember(Name = "private")]
public IEnumerable<AddressInfo> Private { get; set; }
[DataMember(Name = "User-Defined-Network-Name")]
public IEnumerable<AddressInfo> UserDefined { get; set; }
}
次に、逆シリアル化を行うためのいくつかのヘルパーメソッド:
// This will change the DataMember.Name at runtime!
// This will only work if you know the node name in advance.
static void SetUserDefinedNodeName(string userDefinedNodeName)
{
var type = typeof(AddressList);
var property = type.GetProperty("UserDefined", BindingFlags.Default);
var attribute = property.GetCustomAttribute<DataMemberAttribute>();
if (attribute != null)
attribute.Name = userDefinedNodeName;
}
static T Deserialize<T>(string jsonText, string userDefinedNodeName)
{
SetUserDefinedNodeName(userDefinedName);
var jsonBytes = Encoding.UTF8.GetBytes(jsonText);
using (var stream = new MemoryStream(jsonBytes))
{
var serializer = new DataContractJsonSerializer(typeof(T));
var obj = serializer.ReadObject(stream) as T;
return obj;
}
}
次に、次のように使用します。
var jsonText = // get your json text somehow
var addressList = Deserialize<AddressList>(jsonText);