JavaScriptSerializer C# 和泛型(新手错误我想!)

4

WinForms C#.. 我得到了以下格式的JSON数据(见消息底部),并尝试使用以下代码进行反序列化:

using System.Web.Script.Serialization;

当我只有以下简单的JSON时返回:

{
"objects": [
    {
        "categoryid": "1",
        "name": "funny",
        "serverimageid": "1",
        "dateuploaded": "2008-11-17 16:16:41",
        "enabled": "1"
    },
    {
        "categoryid": "2",
        "name": "happy",
        "serverimageid": "2",
        "dateuploaded": "2008-11-17 16:17:00",
        "enabled": "1"
    },
    {
        "categoryid": "3",
        "name": "sad",
        "serverimageid": "3",
        "dateuploaded": "2008-11-16 16:17:13",
        "enabled": "1"
    }
]
}

然后就很容易反序列化了:(哎呀... 有点糟糕)
// s is the string
s = s.Remove(0, 11);
// last }
int stringLength = s.Length;
s = s.Remove(stringLength - 1, 1);

listOfCategories = serializer1.Deserialize<List<Category>>(s);

在哪里

public class Category
    {
        public int categoryID;
        public string name;
        public int imageID;
        public DateTime dateUpdated;
        public int isActive;
        public int displayOrder;
    }

然而,现在我陷入了困境!尝试了一个列表的列表...但是却一无所获...

非常感谢任何帮助。

{
    "objects": {
        "categories": [
            {
                "name": "Congratulations",
                "imageID": "1",
                "isActive": "1",
                "displayOrder": "0",
                "dateUpdated": "2008-11-27 00:00:00"
            },
            {
                "name": "Animals",
                "imageID": "2",
                "isActive": "1",
                "displayOrder": "0",
                "dateUpdated": "2008-11-26 00:00:00"
            },
            {
                "name": "Romance",
                "imageID": "3",
                "isActive": "1",
                "displayOrder": "0",
                "dateUpdated": "2008-11-24 00:00:00"
            }
        ],
        "present": [
            {
                "presentID": "1",
                "name": "Tiger",
                "categoryID": "2",
                "imageID": "1",
                "dateUpdated": "2008-11-27",
                "isActive": "1",
                "isAnimated": null,
                "isInteractive": null,
                "isAdaptive": null,
                "webLinkURL": null
            },
            {
                "giphtID": "2",
                "name": "Donkey",
                "categoryID": "2",
                "imageID": "2",
                "dateUpdated": "2008-11-27",
                "isActive": "1",
                "isAnimated": null,
                "isInteractive": null,
                "isAdaptive": null,
                "webLinkURL": null
            },
            {
                "giphtID": "3",
                "name": "Elephant",
                "categoryID": "2",
                "imageID": "3",
                "dateUpdated": "2008-11-27",
                "isActive": "1",
                "isAnimated": null,
                "isInteractive": null,
                "isAdaptive": null,
                "webLinkURL": null
            }
        ]
    }
}
2个回答

4

这似乎运行良好(而且没有奇怪的字符串修剪!):

using System;
using System.Collections.Generic;
using System.Web.Script.Serialization;

class Program
{
    static void Main( string[] args )
    {
        string json = System.IO.File.ReadAllText( "../../input.json" );

        var serializer = new JavaScriptSerializer();
        Structure jsonStructure = serializer.Deserialize<Structure>( json );
        System.Diagnostics.Debugger.Break();
    }
}

class Structure
{
    public StructureObjects objects;
}

class StructureObjects
{
    public List<StructureCategory> categories;
    public List<StructurePresent> present;
}

class StructureCategory
{
    public string name;
    public int imageID;
    public DateTime dateUpdated;
    public int isActive;
    public int displayOrder;
}

class StructurePresent
{
    public int presentID;
    public string name;
    public int categoryID;
    public int imageID;
    public DateTime dateUpdated;
    public int isActive;
    public int? isAnimated;
    public int? isInteractive;
    public int? isAdaptive;
    public Uri webLinkURL;
}

感谢 System.Web.Script.Serialization 指针,否则我永远找不到它!

1
非常感谢Simon...这里还有一些要点。非常感激。 - Dave Mateer
不要太认真地对待我 :) - Simon Buchan

1
编辑:以下内容适用于 DataContractJsonSerializer,但不适用于 OP 的 JavascriptSerializer。因此,这仅供参考。
[DataContract]
class Foo
{
    [DataMember(Name = "objects")]
    public Bar Bar { get; set; }
}

[DataContract]
class Bar
{
    public Bar() {
        Categories = new List<Category>();
        Present = new List<Present>();
    }
    [DataMember(Name = "categories")]
    public List<Category> Categories { get; private set; }
    [DataMember(Name = "present")]
    public List<Present> Present { get; private set; }
}
[DataContract]
class Category
{
    [DataMember(Name = "name")]
    public string Name {get;set;}
    [DataMember(Name = "imageID")]
    public int ImageID {get;set;}
    [DataMember(Name = "isActive")]
    public int IsActive {get;set;}
    [DataMember(Name = "displayOrder")]
    public int DisplayOrder {get;set;}
    [DataMember(Name = "dateUpdated")]
    public string DateUpdated {get;set;}
}
[DataContract]
class Present
{
    [DataMember(Name = "presentID")]
    public int PresentID {get;set;}
    [DataMember(Name = "name")]
    public string Name {get;set;}
    [DataMember(Name = "categoryID")]
    public int CategoryID {get;set;}
    [DataMember(Name = "imageID")]
    public int ImageID {get;set;}    
    [DataMember(Name = "dateUpdated")]
    public string DateUpdated {get;set;}
    [DataMember(Name = "isActive")]
    public int IsActive {get;set;}
    [DataMember(Name = "isAnimated")]
    public int? IsAnimated {get;set;}
    [DataMember(Name = "isInteractive")]
    public int? IsInteractive {get;set;}
    [DataMember(Name = "isAdaptive")]
    public int? IsAdaptive {get;set;}
    [DataMember(Name = "webLinkURL")]
    public string WebLinkUrl {get;set;}
}

哈!我比你快了8分钟!<看着声望差异> 叹气 - Simon Buchan
@both - 其实,这样也不会起作用的!请参见顶部的编辑;-p - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接