本人使用的VS2010 需要下載的是 :Json50r6.zip C#5使用;
網上還有一個版本:Newtonsoft.Json.rar 這個只有在C#6才能使用;
下載解壓以后應用看自己的.net版本引用,本人引用的是
使用很方便:
反序列化:
string jsonText = "{\"zone\":\"海淀\",\"zone_en\":\"haidian\"}";
JObject jo = (JObject)JsonConvert.DeserializeObject(jsonText);
string zone = jo["zone"].ToString();
string zone_en = jo["zone_en"].ToString();
//LogUtil.LogInfo(zone);
//LogUtil.LogInfo(zone_en);
序列化:
首先新建一個類
class a
{
/// <summary>
/// 定義實體轉換名字
/// </summary>
[JsonProperty(PropertyName = "CName")]
public string s;
[JsonIgnore]//忽略的屬性
public string d;
[JsonConverter(typeof(ChinaDateTimeConverter))]
[JsonProperty]//支持非公共屬性
DateTime dd;
public DateTime dt;
[JsonConverter(typeof(BoolConvert))]
public bool b;
[DefaultValue(10)]//默認值
int x;
}
里面涉及到了時間格式的轉化和bool類型的轉換(true轉為是,false轉為否),需要重寫兩個類:
//時間類轉換
public class ChinaDateTimeConverter : DateTimeConverterBase
{
private static IsoDateTimeConverter dtConverter = new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd" };//可以自己修改
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return dtConverter.ReadJson(reader, objectType, existingValue, serializer);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
dtConverter.WriteJson(writer, value, serializer);
}
}
//bool類轉化
public class BoolConvert : JsonConverter
{
private string[] arrBString { get; set; }
public BoolConvert()
{
arrBString = "是,否".Split(',');
}
/// <summary>
/// 構造函數
/// </summary>
/// <param name="BooleanString">將bool值轉換成的字符串值</param>
public BoolConvert(string BooleanString)
{
if (string.IsNullOrEmpty(BooleanString))
{
throw new ArgumentNullException();
}
arrBString = BooleanString.Split(',');
if (arrBString.Length != 2)
{
throw new ArgumentException("BooleanString格式不符合規定");
}
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
bool isNullable = IsNullableType(objectType);
Type t = isNullable ? Nullable.GetUnderlyingType(objectType) : objectType;
if (reader.TokenType == JsonToken.Null)
{
if (!IsNullableType(objectType))
{
throw new Exception(string.Format("不能轉換null value to {0}.", objectType));
}
return null;
}
try
{
if (reader.TokenType == JsonToken.String)
{
string boolText = reader.Value.ToString();
if (boolText.Equals(arrBString[0], StringComparison.OrdinalIgnoreCase))
{
return true;
}
else if (boolText.Equals(arrBString[1], StringComparison.OrdinalIgnoreCase))
{
return false;
}
}
if (reader.TokenType == JsonToken.Integer)
{
//數值
return Convert.ToInt32(reader.Value) == 1;
}
}
catch (Exception ex)
{
throw new Exception(string.Format("Error converting value {0} to type '{1}'", reader.Value, objectType));
}
throw new Exception(string.Format("Unexpected token {0} when parsing enum", reader.TokenType));
}
/// <summary>
/// 判斷是否為Bool類型
/// </summary>
/// <param name="objectType">類型</param>
/// <returns>為bool類型則可以進行轉換</returns>
public override bool CanConvert(Type objectType)
{
return true;
}
public bool IsNullableType(Type t)
{
if (t == null)
{
throw new ArgumentNullException("t");
}
return (t.BaseType.FullName == "System.ValueType" && t.GetGenericTypeDefinition() == typeof(Nullable<>));
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
if (value == null)
{
writer.WriteNull();
return;
}
bool bValue = (bool)value;
if (bValue)
{
writer.WriteValue(arrBString[0]);
}
else
{
writer.WriteValue(arrBString[1]);
}
}
}
然后實例化類:
a d = new a();
d.s = "1";
d.d = "2";
d.dt = DateTime.Now;
d.b = false;
///全局設置
JsonSerializerSettings setting = new JsonSerializerSettings();
setting.DateFormatHandling = DateFormatHandling.MicrosoftDateFormat;
setting.DateFormatString = "yyyy-MM-dd HH:mm:ss";
setting.NullValueHandling = NullValueHandling.Ignore; //忽略空值
setting.Converters.Add(new BoolConvert("是,否"));
string js = JsonConvert.SerializeObject(d, Formatting.Indented, setting);