0

几年来,我一直在使用 VB.NET 构建企业软件,但直到最近才开始在 VS2010 Express 中使用 XNA 创建游戏,并且一直在努力过渡到 C#。

我有以下实体:

public class MyEntity
{
    public String Name { get; set; }
    public Microsoft.Xna.Framework.Color Colour { get; set; }

    public MyEntity(string name, Microsoft.Xna.Framework.Color colour)
    {
        this.Name = name;
        this.Colour = colour;
    }
}

我打算将此类的数据存储在 JSON 文件中,例如:

{
    "MyEntities": [
        {"Name": "Entity1", "Colour": {"163", "79", "79"}},
        {"Name": "Entity2", "Colour": {"147", "67", "67"}}
    ]
}

我知道上面的 JSON 是不正确的,但我无法弄清楚如何正确存储颜色的 RGB 值。

此外,我正在努力寻找任何演示如何使用 Newtonsoft.Json 反序列化此 JSON 文件的示例。我最近的尝试显然不起作用:

public static List<MyEntity> LoadMyEntities()
{
    List<MyEntity> entities = new List<MyEntity>();
    using (StreamReader file = File.OpenText(@"entities.json"))
    {
        System.Data.DataSet ds = JsonConvert.DeserializeObject<System.Data.DataSet>(file.ReadToEnd());
        System.Data.DataTable dt = ds.Tables["Entities"];
        foreach (System.Data.DataRow row in dt.Rows)
        {
            entities.Add(new MyEntity(row["Name"].ToString(), new Microsoft.Xna.Framework.Color(row["Colour"]));
        }
    }
    return entities;
}

任何帮助将不胜感激,因为我完全被困在这一点上。

4

2 回答 2

1

更改类如下

public class MyEntity
{
    public string Name { get; set; }
    public Microsoft.Xna.Framework.Color Colour { get; set; }
}

public class RootObject
{
    public List<MyEntity> MyEntities { get; set; }
}

JSON

{
    "MyEntities": [
        {
            "Name": "Entity1",
            "Colour": "23, 33, 33"
        },
        {
            "Name": "Entity2",
            "Colour": "55, 5, 55"
        }
    ]
}

您可以反序列化如下

var result = JsonConvert.DeserializeObject<RootObject>(myjsondata);
于 2013-06-06T13:34:44.120 回答
0

要在没有任何 3rd-party 库的情况下执行此操作:

using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

namespace test
{
    public struct Color
    {
        public byte R { get; set; }
        public byte G { get; set; }
        public byte B { get; set; }
    }

    [DataContract]
    public class MyEntity
    {
        [DataMember]
        public String Name { get; set; }
        [DataMember]
        public Color Colour { get; set; }

        public MyEntity(string name, Color colour)
        {
            this.Name = name;
            this.Colour = colour;
        }
    }

    class Program
    {
        static DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(MyEntity));
        static MyEntity entitySave, entityLoad;

        static void Main(string[] args)
        {
            entitySave = new MyEntity("Entity1", new Color() { R = 50, G = 20, B = 50 });
            Serialize(entitySave, "savefile.json");
            bool success = Deserialize(ref entityLoad, "savefile.json");

            if (success && entityLoad.Name == entitySave.Name)
                Console.WriteLine("It works!");
            else
                Console.WriteLine("Uh-oh :(");

            Console.ReadLine();
        }

        static void Serialize(MyEntity entity, string fileName)
        {
            FileStream stream = new FileStream(fileName, FileMode.Create);
            serializer.WriteObject(stream, entity);
            stream.Close();
        }

        static bool Deserialize(ref MyEntity entity, string fileName)
        {
            if (!File.Exists(fileName)) return false;

            FileStream stream = new FileStream(fileName, FileMode.Open);
            entity = (MyEntity)serializer.ReadObject(stream);
            stream.Close();
            return true;
        }
    }
}

这会生成一个 JSON 文件,其中包含:

{"Colour":{"B":50,"G":20,"R":50},"Name":"Entity1"}

它应该与Microsoft.XNA.Framework.Colorand一起正常工作List<MyEntity>

于 2013-06-06T14:09:44.443 回答