c # десериализовать немаркированный массив JSON - PullRequest
0 голосов
/ 10 октября 2018

Я пытаюсь десериализовать фрагмент JSON с определенной структурой, например, так:

{  
    "label1": "value1",  
    "label2": [  
        [  
            [  
                "concept_id_1",  
                "concept_1"  
            ],  
            score_1  
        ],  
        [  
            [  
                "concept_id_2",  
                "concept_2"  
            ],  
            score_2  
        ],  
        ……  
    ],  
    "label3": "value3",  
    "label4": "value4"  
}  

Для чего бы то ни было, оценки - это числа с плавающей запятой, а все остальное - строка.Число возвращаемых понятий в «label2» является переменным.

Я пытаюсь десериализовать его с помощью JSON.net.Единственный контент, который меня действительно волнует, - это внутреннее гнездо массивов с меткой «label2», однако отсутствие меток внутри массивов блокирует меня на каждом шагу.

Я пробовал разные подходы, ноНаиболее успешным на данный момент, по-видимому, является следующий:

public class Parsed_JSON {
    public string label1 { get; set; }
    public ICollection<Full_Result> label2 { get; set; }
    public string label3 { get; set; }
    public string label4 { get; set; }
}

public class Full_Result {
    public IList<string> values { get; set; }
    public float score { get; set; }
}

Parsed_JSON result = JsonConvert.DeserializeObject<Parsed_JSON>(JSON);

Однако это не удается из-за ошибки:

Невозможно десериализовать текущий массив JSON (например, [1,2,3]) в тип 'JSON_Parsing + Full_Result', поскольку для корректной десериализации типу требуется объект JSON (например, {"name": "value"}).
Чтобы исправить эту ошибку, либо измените JSON на объект JSON (например, {"name ":" value "}) или измените десериализованный тип на массив или тип, который реализует интерфейс коллекции (например, ICollection, IList), например List, который можно десериализовать из массива JSON.JsonArrayAttribute также может быть добавлен к типу, чтобы заставить его десериализоваться из массива JSON.

В конечном итоге я постараюсь перебрать содержимое label2, чтобы я мог создать из них DataTable, например:итак:

concept_id_1   concept_1   score_1  
concept_id_2   concept_2   score_2

Как я могу десериализовать этот JSON?

1 Ответ

0 голосов
/ 10 октября 2018

Вы можете использовать пользовательский JsonConverter ObjectToArrayConverter<Full_Result> от этого ответа до C # JSON.NET - десериализовать ответ, который использует необычную структуру данных для десериализации вашего JSON в существующую типизированную модель данных.Измените Full_Result следующим образом:

[JsonConverter(typeof(ObjectToArrayConverter<Full_Result>))]
public class Full_Result 
{
    [JsonProperty(Order = 1)]
    public IList<string> values { get; set; }
    [JsonProperty(Order = 2)]
    public float score { get; set; }
}

И теперь вы сможете десериализоваться следующим образом:

Parsed_JSON result = JsonConvert.DeserializeObject<Parsed_JSON>(JSON);

Примечания:

  • ObjectToArrayConverter<T> работает путем сопоставления сериализуемых членов T с массивом, где последовательность массива определяется значением атрибута JsonPropertyAttribute.Order, применяемого к каждому члену. Атрибуты контракта данных с набором DataMemberAttribute.Order можно использовать вместо этого, если вы предпочитаете.

  • В вашем JSON значения "Score"на самом деле это не числа:

    score_1
    score_2
    

    Я предполагаю, что это опечатка в вопросе, и что эти значения на самом деле являются правильно сформированными числами, как определено стандартом JSON .

Образец скрипки здесь .

...