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