1

REST サービスを使用していますが、次のような形式の json を返します。

{
"ea:productionId": "123",
....
}

このタイプの json に対応するクラスをサーバー側で作成して解析するにはどうすればよいですか? 私はc#を使用しています。

EDIT 私はC#2.0を使用 していますこれは私が使用しているコードです

JavaScriptSerializer serializer = new JavaScriptSerializer();
        JsonClass result= serializer.Deserialize<JsonClass>(jsonresult);

JsonClass は、jsonresult の属性に対応するフィールドで作成したクラスです。そして問題は、ea:productionId含まれている名前のプロパティを作成できないこと:です。

4

2 に答える 2

2

質問で示したのは、無効な JSON です。私はあなたがこれを意味したと思います:

{
    "ea:productionId": "123",
    ....
}

これは、モデルの属性をJson.NET使用するシリアライザーで簡単に実現できます。[DataContract][DataMember]

[DataContract]
public class JsonClass
{
    [DataMember(Name = "ea:productionId")]
    public string ProductId { get; set; }
}

その後:

JsonClass result = JsonConvert.DeserializeObject<JsonClass>(jsonresult);

サードパーティの JSON シリアライザーを使用したくない場合はDataContractJsonSerializer、DataContract および DataMember 属性も尊重する組み込みクラスを使用できます。

var serializer = new DataContractJsonSerializer(typeof(JsonClass));
byte[] data = Encoding.UTF8.GetBytes(jsonresult);
using (var stream = new MemoryStream(data))
{
    var result = (JsonClass)serializer.ReadObject(stream);
}

アップデート:

.NET 2.0 を使用しているようで、新しいシリアライザーに頼ることができません。JavaScriptSerializer を使用すると、カスタム コンバーターを作成できます。

public class MyJavaScriptConverter : JavaScriptConverter
{
    private static readonly Type[] supportedTypes = new[] { typeof(JsonClass) };

    public override IEnumerable<Type> SupportedTypes
    {
        get { return supportedTypes; }
    }

    public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
    {
        if (type == typeof(JsonClass))
        {
            var result = new JsonClass();
            object productId;
            if (dictionary.TryGetValue("ea:productionId", out productId))
            {
                result.ProductId = serializer.ConvertToType<string>(productId);
            }

            ... so on for the other properties

            return result;
        }

        return null;
    }

    public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

その後:

var serializer = new JavaScriptSerializer();
serializer.RegisterConverters(new[] { new MyJavaScriptConverter() });
var result = serializer.Deserialize<JsonClass>(jsonresult);

または、モデルの代わりに弱く型付けされた辞書を使用できます。

var serializer = new JavaScriptSerializer();
var res = (IDictionary<string, object>)serializer.DeserializeObject(jsonresult);
string productId = res["ea:productionId"] as string;
于 2013-09-18T12:07:49.150 に答える