Я пытаюсь разобрать следующий json: http://libris.kb.se/xsearch?query=%22design%22+language:%28%22ENG%22%29&format=json&format_level=full&database=swepub Как вы можете видеть в первом элементе элемента списка, описание представляет собой обычную строку. Это справедливо и для другого 8 результата, но по 9-му результату он по какой-то причине превращается в массив строк.Parsing json string, который иногда является массивом
Я использую C# и DataContract, пытаясь разобрать это, но он, очевидно, не будет работать, поскольку тип отличается от результата. Как я могу обойти это? Я предполагаю, что можно просто вручную разобрать все, но я не хочу этого делать.
Это мой DataContract-х
[DataContract]
public class SwepubHeader
{
[DataMember(Name = "xsearch")]
public SwepubBody Body { get; set; }
}
[DataContract]
public class SwepubBody
{
[DataMember(Name = "from")]
public int From { get; set; }
[DataMember(Name = "to")]
public int To { get; set; }
[DataMember(Name = "records")]
public int Records { get; set; }
[DataMember(Name = "list")]
public SwepubSearchItem[] SearchItems { get; set; }
}
[DataContract]
public class SwepubSearchItem
{
[DataMember(Name = "isbn")]
public string ISBN { get; set; }
[DataMember(Name = "title")]
public string Title { get; set; }
[DataMember(Name = "description")]
public string Description { get; set; }
[DataMember(Name = "identifier")]
public string Identifier { get; set; }
[DataMember(Name = "type")]
public string Type { get; set; }
[DataMember(Name = "publisher")]
public string Publisher { get; set; }
[DataMember(Name = "date")]
public string Date { get; set; }
[DataMember(Name = "language")]
public string Language { get; set; }
[DataMember(Name = "relation")]
public string Relation { get; set; }
[DataMember(Name = "subject")]
public string[] Subjects { get; set; }
[DataMember(Name = "creator")]
public string[] Creators { get; set; }
}
и это, как я разобрать его
using (var response = request.GetResponse() as HttpWebResponse)
{
if (response != null)
{
if (response.StatusCode != HttpStatusCode.OK)
throw new Exception(String.Format(
"Server error (HTTP {0}: {1}).",
response.StatusCode,
response.StatusDescription));
var jsonSerializer = new DataContractJsonSerializer(typeof(SwepubHeader));
object objResponse = jsonSerializer.ReadObject(response.GetResponseStream());
var jsonResponse = objResponse as SwepubHeader;
return jsonResponse;
}
}
Если они дают вам различные типы данных, то, что они делают что-то неправильно и вы должны сказать им. Они должны обеспечивать согласованный тип своих записей. Чтобы обойти это без ручного анализа вещей, вы можете просто определить два похожих типа (оба из которых основаны на одной базе) - один со строкой и один с строковым массивом - вы можете попробовать/уловить сериализацию в одну, а затем другую , Оба класса могли реализовать что-то вроде 'GetDescription()', который читает строку или объединяет строковый массив. –
, вероятно, поможет: http://stackoverflow.com/questions/7501846/xml-serialize-dynamic-object –
Я бы использовал Json.Net вместо DataContractJsonSerializer. Он может десериализоваться почти в два раза быстрее и имеет больше возможностей. Например, вы можете создать JsonConverter, который примет это значение и позволит вам определить, как он десериализован. –