C# 以编程方式实现Json.Net序列化

C# 以编程方式实现Json.Net序列化,c#,json,serialization,C#,Json,Serialization,我必须将一些信息序列化为json,然后将它们写入一个文件。 实际上,我想要达到的结果是: { "Email": "james@example.com", "Active": true, "CreatedDate": "2013-01-20T00:00:00Z", "libraries": [ { "name": "name1" }, { "name": "name2" } ] } { "Email": "james

我必须将一些信息序列化为json,然后将它们写入一个文件。 实际上,我想要达到的结果是:

{
  "Email": "james@example.com",
  "Active": true,
  "CreatedDate": "2013-01-20T00:00:00Z",
  "libraries": [
    {
      "name": "name1"
    },
    {
      "name": "name2"
    }
  ]
}
{
  "Email": "james@example.com",
  "Active": true,
  "CreatedDate": "2013-01-20T00:00:00Z",
  "libraries": [
    "Small",
    "Medium",
    "Large"
  ]
}
这是我用来存储信息的类:

public class JSON
{
    public string Email { get; set; }
    public bool Active { get; set; }
    public DateTime CreatedDate { get; set; }
    public string[] libraries { get; set; }
}
然后我用这个来序列化它们:

JSON account = new JSON
{
    Email = "james@example.com",
    Active = true,
    CreatedDate = new DateTime(2013, 1, 20, 0, 0, 0, DateTimeKind.Utc),
    libraries = new[] {"Small","Medium","Large" }

};

string json = JsonConvert.SerializeObject(account, Formatting.Indented);
问题是,实际上我得到的结果是:

{
  "Email": "james@example.com",
  "Active": true,
  "CreatedDate": "2013-01-20T00:00:00Z",
  "libraries": [
    {
      "name": "name1"
    },
    {
      "name": "name2"
    }
  ]
}
{
  "Email": "james@example.com",
  "Active": true,
  "CreatedDate": "2013-01-20T00:00:00Z",
  "libraries": [
    "Small",
    "Medium",
    "Large"
  ]
}

如何解决此问题?

将您的JSON类更改为以下类型:

public class Library
{
    public string name { get; set; }
}

public class JSON
{
    public string Email { get; set; }
    public bool Active { get; set; }
    public string CreatedDate { get; set; }
    public List<Library> libraries { get; set; }
}
公共类库
{
公共字符串名称{get;set;}
}
公共类JSON
{
公共字符串电子邮件{get;set;}
公共bool活动{get;set;}
公共字符串CreatedDate{get;set;}
公共列表库{get;set;}
}
如何使用在线工具生成课程

好的提示是使用它来生成C#类

如何使用Visual Studio生成类

另一种选择是使用内置的Visual Studio功能(适用于VS2013及更高版本)

如果剪贴板中有JSON文件,您可以:

编辑->粘贴特殊->将JSON粘贴为类

如何使用新类

JSON account = new JSON
{
    Email = "james@example.com",
    Active = true,
    CreatedDate = new DateTime(2013, 1, 20, 0, 0, 0, DateTimeKind.Utc),
    libraries = new List<Library>  
            {
              new Library {name = "Small"},
              new Library {name = "Medium"},
              new Library {name = "Large"} 
            }

};
JSON帐户=新的JSON
{
电子邮件=”james@example.com",
活动=真,
CreatedDate=新的日期时间(2013,1,20,0,0,0,DateTimeKind.Utc),
库=新列表
{
新库{name=“Small”},
新库{name=“Medium”},
新库{name=“Large”}
}
};

将JSON类更改为此类:

public class Library
{
    public string name { get; set; }
}

public class JSON
{
    public string Email { get; set; }
    public bool Active { get; set; }
    public string CreatedDate { get; set; }
    public List<Library> libraries { get; set; }
}
公共类库
{
公共字符串名称{get;set;}
}
公共类JSON
{
公共字符串电子邮件{get;set;}
公共bool活动{get;set;}
公共字符串CreatedDate{get;set;}
公共列表库{get;set;}
}
如何使用在线工具生成课程

好的提示是使用它来生成C#类

如何使用Visual Studio生成类

另一种选择是使用内置的Visual Studio功能(适用于VS2013及更高版本)

如果剪贴板中有JSON文件,您可以:

编辑->粘贴特殊->将JSON粘贴为类

如何使用新类

JSON account = new JSON
{
    Email = "james@example.com",
    Active = true,
    CreatedDate = new DateTime(2013, 1, 20, 0, 0, 0, DateTimeKind.Utc),
    libraries = new List<Library>  
            {
              new Library {name = "Small"},
              new Library {name = "Medium"},
              new Library {name = "Large"} 
            }

};
JSON帐户=新的JSON
{
电子邮件=”james@example.com",
活动=真,
CreatedDate=新的日期时间(2013,1,20,0,0,0,DateTimeKind.Utc),
库=新列表
{
新库{name=“Small”},
新库{name=“Medium”},
新库{name=“Large”}
}
};

您可以使用自定义转换器:

public class ArrayItemAsObjectConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(string[]);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        string[] items = (string[])value;

        writer.WriteStartArray();

        for (int i = 0; i < items.Length; i++)
        {
            writer.WriteStartObject();
            writer.WritePropertyName("name");
            writer.WriteValue(items[i]);
            writer.WriteEndObject();
        }

        writer.WriteEndArray();
    }
}
///

[JsonConverter(typeof(ArrayItemAsObjectConverter))]
public string[] libraries { get; set; }
public类ArrayItemAsObjectConverter:JsonConverter
{
公共覆盖布尔CanConvert(类型objectType)
{
返回objectType==typeof(字符串[]);
}
公共重写对象ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序)
{
抛出新的NotImplementedException();
}
公共重写void WriteJson(JsonWriter编写器、对象值、JsonSerializer序列化器)
{
字符串[]项=(字符串[])值;
writer.writestarray();
对于(int i=0;i
您可以使用自定义转换器:

public class ArrayItemAsObjectConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(string[]);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        string[] items = (string[])value;

        writer.WriteStartArray();

        for (int i = 0; i < items.Length; i++)
        {
            writer.WriteStartObject();
            writer.WritePropertyName("name");
            writer.WriteValue(items[i]);
            writer.WriteEndObject();
        }

        writer.WriteEndArray();
    }
}
///

[JsonConverter(typeof(ArrayItemAsObjectConverter))]
public string[] libraries { get; set; }
public类ArrayItemAsObjectConverter:JsonConverter
{
公共覆盖布尔CanConvert(类型objectType)
{
返回objectType==typeof(字符串[]);
}
公共重写对象ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序)
{
抛出新的NotImplementedException();
}
公共重写void WriteJson(JsonWriter编写器、对象值、JsonSerializer序列化器)
{
字符串[]项=(字符串[])值;
writer.writestarray();
对于(int i=0;i
使用Visual Studio,您可以创建以下类:

public class Rootobject
{
    public string Email { get; set; }
    public bool Active { get; set; }
    public DateTime CreatedDate { get; set; }
    public Library[] libraries { get; set; }
}

  public class Library
  {
      public string name { get; set; }
  }
您需要复制json字符串并将其粘贴为json类。转到菜单,然后单击编辑,您将找到它

使用System.Web.Script.Serialization;
JavaScriptSerializer oJS=新的JavaScriptSerializer();
RootObject oRootObject=新的RootObject();
oRootObject=oJS.Deserialize(您的JSon字符串);

使用Visual Studio,您可以创建以下类:

public class Rootobject
{
    public string Email { get; set; }
    public bool Active { get; set; }
    public DateTime CreatedDate { get; set; }
    public Library[] libraries { get; set; }
}

  public class Library
  {
      public string name { get; set; }
  }
您需要复制json字符串并将其粘贴为json类。转到菜单,然后单击编辑,您将找到它

使用System.Web.Script.Serialization;
JavaScriptSerializer oJS=新的JavaScriptSerializer();
RootObject oRootObject=新的RootObject();
oRootObject=oJS.Deserialize(您的JSon字符串);

我该怎么办?libraries=new[]{“Small”、“Medium”、“Large”}如果使用公共库[]库{get;set;}而不是公共列表库{get;set;},则效果很好。这给了我一个转换错误是的,你是对的。我又更新了一次示例。您可以使用数组或列表。我该如何处理它?libraries=new[]{“Small”、“Medium”、“Large”}如果使用公共库[]库{get;set;}而不是公共列表库{get;set;},则效果很好。这给了我一个转换错误是的,你是对的。我又更新了一次示例。您可以使用数组或列表。