7

我正在使用fastJSON,但遇到了问题。我无法获取 JSON 字符串并将其转换为对象集合。

我认为它可以处理这个问题,但也许我做错了或被误解了。

处理对象的多态集合

这是我在 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 库(我认为有一个用于 monodroid,但我试图让我的代码在我做 iPhone 部分时可重用)。

4

2 回答 2

5

Note that as of fastJSON 2.x, the OP code should basically work fine (note that the syntax has changed slightly).

List<Class1> wallets = JSON.ToObject<List<Class1>>(json);
于 2014-06-08T08:51:48.490 回答
4

您不应该使用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 项目站点上向问题跟踪器提交问题

于 2011-08-11T14:22:01.317 回答