2012-04-01 3 views
2

Я пытаюсь разобрать JSON на Windows Phone с DataContractJsonSerializer. Все ответы JSON имеют одинаковый формат: статус, сообщение, данные. Поле состояния и сообщения всегда имеет один и тот же тип, но поле данных содержит объект, специфичный для вызова. Вот некоторые примеры:Извлечь внутренний объект JSON для отдельного разбора

Hash

{ 
status: 0, 
message: "No error", 
data: 
    { 
    team: "test", 
    startTime: "1969-12-31 19:00:00 -0500", 
    endTime: "2000-01-01 00:00:00 -0500", 
    max_photos: 30, 
    max_judged_photos: 24 
    } 
} 

Список

{ 
status: 0, 
message: "No error", 
data: 
    [ 
    { 
     id: 1, 
     game_id: "Test", 
     description: "Test", 
     points: 100 
    }, 
    { 
     id: 2, 
     game_id: "Test", 
     description: "Test", 
     points: 1000 
    } 
    ] 
} 

Я хотел бы разобрать ответов в общий Response объект, содержащий статус, сообщение и данные. Затем я хочу проанализировать JSON в данных в правильный объект (хэш или список). Вот что мой Response класс в настоящее время выглядит следующим образом:

[DataContract] 
public class Response 
{ 
    [DataMember(Name = "status", IsRequired=true)] 
    public STATUS Status { get; set; } 

    [DataMember(Name = "message", IsRequired = true)] 
    public string Message { get; set; } 

    [DataMember(Name = "data", IsRequired = true)] 
    public ?????? Data { get; set; } 
} 

Мой вопрос, есть ли общий JSON контейнер можно использовать для удержания внутреннего JSON в поле данных (так что я могу разобрать, что отдельно) или есть лучший способ решить это вообще? Я бы предпочел не иметь отдельных классов Response для каждого типа ответа.

спасибо.

ответ

2

С data иногда является массивом, а иногда и единственным объектом, вы не можете десериализовать его в безопасном классе типа.

Но вы можете использовать Json.Net (который работает на WP7) для анализа строки json.

JObject json = (JObject)JsonConvert.DeserializeObject(jsonstr); 
if (json["data"] is JArray) 
{ 
    foreach(var item in json["data"]) 
     Console.WriteLine(item["id"]); 
}else{ 
    Console.WriteLine(json["data"]["startTime"]); 
} 
+1

JSON.NET была одобрена Microsoft, так что это безопасно альтернатива родному JSON Serializer –

+0

после того, как он был загружен как объект JObject, можно ли его перевести в соответствующий класс? –

0

Другим вариантом является структуру данных как

[DataContract] 
public class Response 
{ 
    [DataMember(Name = "status", IsRequired=true)] 
    public STATUS Status { get; set; } 

    [DataMember(Name = "message", IsRequired = true)] 
    public string Message { get; set; } 

    [DataMember(Name = "data", IsRequired = true)] 
    public dynamic Data { get; set; } 
} 

Вы можете получить внутренний JSON с помощью:

var response = JsonConvert.DeserializeObject<Response>(json); 
var innerJson = response.Data.ToString(); 
Смежные вопросы