1

我正在使用 wp7,即使我在 VS 突出显示中键入“动态”并让我编译和运行应用程序,但是一旦我尝试使用它,我就会得到编译错误。

我读到我不能使用动态关键字,现在有点迷失了如何进行我的 json 解析(我正在使用 json.net 和 restsharp,但如果我不能使用动态,它们都会遇到同样的问题)

例如说如果我使用foursquare api。所有 json 数据总是像这样返回

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

但响应会有不同的数据。例如,它可能有用户数据(用户类)或者它可能有场地数据(场地类)。

但最重要的是,我需要一个名为 Response 的类,它位于 RootObject 类中。

但是我不能有相同的类名(除非我开始将它们放在不同的名称空间中,但对这个想法并不疯狂)。

我能想到的唯一一件糟糕的事情是

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 回答