Как десериализовать JSON в IList> с пробелами в ключе? - PullRequest
1 голос
/ 29 мая 2019

У меня большая проблема с десериализацией моего JSON для объекта. Следует десериализовать до IList<KeyValuePair<string, object>> проблема в том, что ключи имеют пробелы.

"spec": {
         "SOMETHING WITH SPACES" : "10"
         etc. 
         ...
}
public class SomeObject
{
...
public IList<KeyValuePair<string, object>> spec{ get; set; }
...
}

Код десериализации:

var sr = new ServiceStack.Text.JsonSerializer<SomeObject>();
var esResult = sr.DeserializeFromString(responseJson);

responseJson это GET от ElasticSearch.

То, что я получаю на своем поле, является нулевым. Если у меня есть ключ без пробелов, он десериализуется нормально, и я получаю IList<KeyValuePair<string, object>>

Ответы [ 3 ]

1 голос
/ 29 мая 2019

Вы не можете использовать IList или List здесь, потому что в вашем исходном JSON нет [ ], что является обязательным требованием, если вы хотите разобрать такую ​​коллекцию.Другими словами, без [ ] вы не сможете разобрать коллекцию, по крайней мере, не пройдя через множество циклов.

Вместо этого вам нужно использовать словарь, как уже предлагалось в комментариях.

Примечание: я использовал Newtonsoft JsonConvert, потому что вы не указали, что такое ваш анализатор, но это не должно иметь большого значения или не повлияет на мои аргументы.

Рабочий код:

var json = "{ \"spec\": { \"SOMETHING WITH SPACES\" : \"10\" } }";
var someObj = JsonConvert.DeserializeObject<SomeObject>(json);

public class SomeObject
{
    public Dictionary<string, object> spec{ get; set; }
}

После этого вы можете преобразовать свойство spec в IEnumerable и просмотреть все найденное:

foreach (var pair in someObj.spec as IEnumerable<KeyValuePair<string, object>>)
{
    Console.WriteLine(pair.Key + " -> " + pair.Value);
}

Или даже преобразовать его в список:

var list = someObj.spec.ToList();
foreach (var pair in list)
{
    Console.WriteLine(pair.Key + " -> " + pair.Value);
}

.NET Fiddle: https://dotnetfiddle.net/15l2R3

0 голосов
/ 29 мая 2019

Если вы не возражаете против использования Newtonsoft.Json:

    const string json = @"{""spec"": { ""SOMETHING WITH SPACES"" : ""10"", ""SOMETHING WITH MORE SPACES"" : ""20"" }}";
    dynamic data = JsonConvert.DeserializeObject(json);
    Dictionary<string, string> list = data["spec"].ToObject<Dictionary<string, string>>();
    foreach (var item in list)
    {
        Console.WriteLine(item.Key + ", " + item.Value);
    }
0 голосов
/ 29 мая 2019

Полагаю, ваш сериал JSON создает некоторые проблемы. Я бы порекомендовал использовать Newtonsoft.Json (в NuGet) Я пробовал следующий код, и он отлично работает:

        var o1 = new SomeObject() { spec = new List<KeyValuePair<string, object>>() };
        o1.spec.Add(new KeyValuePair<string, object>("test with spaces", 10));

        var r1 = Newtonsoft.Json.JsonConvert.SerializeObject(o1);
        Console.WriteLine(r1);
        var o2 = Newtonsoft.Json.JsonConvert.DeserializeObject<SomeObject>(r1);
        var r2 = Newtonsoft.Json.JsonConvert.SerializeObject(o2);
        Console.WriteLine(r2);

Результат

{"spec":[{"Key":"test with spaces","Value":10}]}
{"spec":[{"Key":"test with spaces","Value":10}]}

Нет нулевых значений, все отлично работает.

РЕДАКТИРОВАТЬ: Я на самом деле не вижу причин, почему пробелы должны быть какие-либо проблемы вообще. Они просто часть строки.

...