Существуют ли сериализаторы JSON для C # .Net 4.0+, которые сериализуют JSON в словарьи динамический [] - PullRequest
0 голосов
/ 12 сентября 2011

Я знаю, что вы можете сериализовать JSON в словарь и объект [], но проблема в том, что вам нужно постоянно приводить вещи повсюду:

using System.Web.Script.Serialization;

var json = new JavaScriptSerializer { }.DeserializeObject(@"{array:['item1','item2']}") as Dictionary<string, object>;
var strings = new List<string> { };
if (json != null)
{
    var array = json["array"] as object[];
    if (array != null)
    {
        foreach (var item in array.Select(i=>i as string))
        {
            if (!string.IsNullOrWhiteSpace(item))
            {
                strings.Add(item);
            }
        }
    }
}
return strings.ToArray();

Я бы предпочел сделать что-то похожее на:

try
{
    var json = new JavaScriptSerializer { }.DeserializeDynamic(@"{array:['item1','item2']}") as Dictionary<string, dynamic>;
    var strings = new List<string>{};
    foreach (var item in json["array"])
        strings.Add(item as string);
    return strings.ToArray();
}
catch { return null; }

У меня возникли проблемы с объектами [] и типами чисел, я никогда не уверен, будет ли это целое число, число с плавающей запятой, десятичное число или двойное и т. Д. Я не могу очистить данные JSON, чтобы надежно это только двойной ...

Существуют ли сериализаторы JSON для .Net 4.0, которые выводят словарь и динамический []? Это выглядит как более естественный выбор для работы с json, чем Dictionary и object [] ...

Ответы [ 2 ]

1 голос
/ 13 сентября 2011

Dictionary<string, object> и Dictionary<string, dynamic> - это те же типы, что и для среды выполнения.

Например, это работает:

var dynDic =new Dictionary<string,object>{ {"test", 1}}
                    as Dictionary<string,dynamic>;
int value = dynDic["test"];

Итак, если ваши первые работы:

var json = new JavaScriptSerializer { }
         .DeserializeObject(@"{array:['item1','item2']}") 
         as Dictionary<string, object>;

тогда так и должно быть:

var json = new JavaScriptSerializer { }
         .DeserializeDynamic(@"{array:['item1','item2']}")
         as Dictionary<string, dynamic>;

Но тогда:

foreach (var item in json["array"])
    strings.Add(item as string);

не использует динамический вызов, поэтому он компилирует то же самое, независимо от того, был ли элемент var object или dynamic, поэтому, если у вас возникли проблемы, я предполагаю, что он использует dynamic.

То же правило применяется к object[] и dynamic[], они одного типа, вы можете свободно приводить между ними, когда вы приводите, вы просто говорите компилятору, как использовать object s из этого массива.

dynamic[] dynArr = new object[]{1};

Таким образом, ответ таков: все, что будет десериализовано до Dictionary<string,object> или object[], может использоваться как Dictionary<string,dynamic> или dynamic[]

1 голос
/ 12 сентября 2011

JSON.NET должен удовлетворить ваши потребности (с Json.NET Dynamic Extensions ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...