Как использовать FastJson для перехода от строки Json к коллекции объектов - PullRequest
7 голосов
/ 11 августа 2011

Я использую fastJSON , и я столкнулся с проблемой.Я не могу взять строку JSON и преобразовать ее в коллекцию объектов.

Я думал, что это может с этим справиться, но, возможно, я делаю это неправильно или неправильно.

Обрабатывает полиморфные коллекцииobjects

Вот пример, который я сделал в приложении строки C # cmd (просто загрузите файлы .cs, добавьте в проект и скопируйте следующий код для проверки).

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Class1> store = new List<Class1>();
            for (int i = 0; i < 3; i++)
            {
                Class1 c = new Class1();
                c.Name = "test";
                c.Start = DateTime.Now;
                store.Add(c);
            }

           string jsonResult = fastJSON.JSON.Instance.ToJSON(store);

           List<Class1> backToObject = fastJSON.JSON.Instance.
               ToObject<List<Class1>>(jsonResult);
        }
    }

    public class Class1
    {
        public string Name { get; set; }
        public DateTime Start { get; set; }
    }
}

backToObject всегда равно нулю.

Я использую fastJSON, потому что мне нужно что-то, что действительно не зависит от библиотек .NET, и я использую monodroid (и, возможно, позже monotouch), и это очень требовательно к тому, что вы можете использовать и не можете использовать.

Например, я не могу использовать библиотеку Json.net (я думаю, что она есть для монодроида, но я пытаюсь сделать свой код многоразовым, когда я делаю часть iPhone).

Ответы [ 2 ]

4 голосов
/ 08 июня 2014

Обратите внимание, что с fastJSON 2.x код OP в основном должен работать нормально (обратите внимание, что синтаксис немного изменился).

List<Class1> wallets = JSON.ToObject<List<Class1>>(json);
4 голосов
/ 11 августа 2011

Вы не должны использовать ToObject для десериализации массива. Вместо этого вы должны использовать метод Parse для анализа JSON.

При использовании ToObject вы предполагаете, что у вас есть экземпляр объекта в JSON, который подвергается десериализации (не массив или скалярное значение), с Parse он будет обрабатывать любой тип, который сериализуется в JSON и вернуть соответствующий тип.

В этом случае вызов Parse и передача ему jsonResult вернет ArrayList, который содержит три экземпляра:

ArrayList arrayList = fastJSON.JSON.Instance.parse(jsonResult) as ArrayList;

Проблема в том, что теперь у вас есть ArrayList, содержащий несколько Dictionary<string, object> экземпляров, которые имеют скалярные значения (или другие Dictionary<string, object> экземпляры, в случае ссылок), сопоставленные с именем свойства.

Я бы отнес это к ошибке. Я ожидаю, что синтаксический анализ массива будет обрабатывать это правильно.

Вы можете изменить код для ParseArray, чтобы прослушивать тип, когда выполняется вызов array.Add.

Это все еще оставляет проблему с ParseNumber (который потенциально может быть вызван), возвращающим строку. Это может или не может повлиять на вас.

Я внесу любые необходимые изменения, а также сообщу о проблеме с помощью средства отслеживания ошибок на сайте проекта CodePlex .

...