1

私はwp7で作業していますが、VSハイライトで「動的」と入力すると、アプリケーションをコンパイルして実行できますが、使用しようとするとすぐにコンパイルエラーが発生します。

私は動的キーワードを使用できないことを読みましたが、jsonの解析方法について少し迷っています(json.netとrestsharpを使用していますが、動的を使用できない場合、両方とも同じ問題に遭遇します)

たとえば、foursquare api を使用するとします。すべてのjsonデータは常に次のように返されます

 {
          "meta": {
            "code": 200,
             ...errorType and errorDetail...
          },
          "notifications": {
             ...notifications...
          },
          "response": {
             ...results...
          }
        }

ただし、応答には異なるデータが含まれます。たとえば、ユーザー データ (ユーザー クラス) や会場データ (会場クラス) が含まれる場合があります。

肝心なのは、RootObject クラスに含まれる Response というクラスが必要になるということです。

しかし、私は同じクラス名を持つことはできません (別の名前空間に入れ始めても、そのアイデアに夢中にならない限り)。

私が考えることができる唯一の他のことは、あまりにもひどいことです

public class RootObject
{
    public Response Response { get; set; }
}

public class Response
{
    public User User { get; set; }
    public List<Venue> Venues { get; set; }
}

この応答オブジェクトは、最終的に返される可能性のあるすべての異なるクラスを持ち、実際には、おそらく応答オブジェクトのプロパティのみが埋められます。

より良い方法はありますか?

4

1 に答える 1

2

わかりました、サンプルをまとめるのに永遠にかかりました (私は OAuth が嫌いです) がJsonConverter、インターフェースで を使用して応答を解析することができます。

見る:

UserVenuesの例を次に示します。

コンバータ:

public class ResponseConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(IResponse));
    }

    public override object ReadJson(JsonReader reader,
                                    Type objectType,
                                    object existingValue,
                                    JsonSerializer serializer)
    {
        // reader is forward only so we need to parse it
        var jObject = JObject.Load(reader);

        if(jObject["user"] != null)
        {
            var user = jObject.ToObject<UserResponse>();
            return user;
        }

        if(jObject["venues"] != null)
        {
            var venue = jObject.ToObject<VenuesResponse>();
            return venue;
        }

        throw new NotImplementedException("This reponse type is not implemented");
    }

    public override void WriteJson(JsonWriter writer,
                                   object value,
                                   JsonSerializer serializer)
    {
        // Left as an exercise to the reader :)
        throw new NotImplementedException();
    }
}

DTO:

public class ApiRespose
{
    public ApiRespose()
    {
        Notifications = new List<Notification>();
    }

    [JsonProperty("meta")]
    public Meta Meta { get; set; }

    [JsonProperty("notifications")]
    public List<Notification> Notifications { get; set; }

    [JsonProperty("response")]
    [JsonConverter(typeof(ResponseConverter))]
    public IResponse Response { get; set; }
}

public interface IResponse
{
}

public class UserResponse : IResponse
{
    [JsonProperty("id")]
    public string Id { get; set; }

    [JsonProperty("firstname")]
    public string FirstName { get; set; }

    [JsonProperty("lastname")]
    public string LastName { get; set; }
    // Other properties
}

public class VenuesResponse : IResponse
{
    public VenuesResponse()
    {
        Venues = new List<Venue>();
    }

    [JsonProperty("venues")]
    public List<Venue> Venues { get; set; }
}

public class Venue
{
    [JsonProperty("id")]
    public string Id { get; set; }

    [JsonProperty("name")]
    public string Name { get; set; }
    // Other Properties
}

public class Meta
{
    [JsonProperty("code")]
    public int Code { get; set; }
}

public class Notification
{
    [JsonProperty("type")]
    public string Type { get; set; }

    [JsonProperty("item")]
    public Item Item { get; set; }
}

public class Item
{
    [JsonProperty("unreadcount")]
    public int UnreadCount { get; set; }
}

使用法:

string jsonData = GetJsonData();

var apiResponse = JsonConvert.DeserializeObject<ApiResponse>(json);
于 2013-07-07T06:08:38.767 に答える