如何使用FastJson从Json字符串转到Object Collection

时间:2011-08-10 20:18:01

标签: c# .net json fastjson

我正在使用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部分时)。

2 个答案:

答案 0 :(得分: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(可能被调用)返回字符串的问题。这可能会或可能不会影响您。

我会做出你需要的任何改变以及file an issue with the issue tracker on the CodePlex project site

答案 1 :(得分:4)

请注意,从fastJSON 2.x开始,OP代码基本上可以正常工作(请注意语法稍有改动)。

List<Class1> wallets = JSON.ToObject<List<Class1>>(json);