JSON

注意事项:

  • Newtonsoft、LitJson都可以转成List和数组
  • Newtonsoft可以转成任意key的字典,LitJson只能转成key为string类型的字典
  • Newtonsoft转成json可保留汉字,LitJson会把汉字转成十六进制Unicode码
  • Newtonsoft 序列化 / 反序列化抽象类、接口时,创建一个JsonSerializerSettings类,其中字段TypeNameHandling设置为All或者Auto,序列化 / 反序列化时把这个setting类传参进去,就正常了

Newtonsoft存储字典Dictionary的结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"0": {
        "id": 0,
        "status": "返回值为0",
        "metaData": {
            "saas_username": "已退出0",
            "saas_groupname": "gr0"
        }
    },
    "1": {
        "id": 1,
        "status": "返回值为1",
        "metaData": {
            "saas_username": "已退出1",
            "saas_groupname": "gr1"
        }
    }
}

但是如果key用复杂类型,比如MetaData,则存储后会变成类似”JustStudy.C01_Json+MetaData”: {…}这种鬼样子,命名空间.类名+key类名

Newtonsoft

[JsonIgnore] 忽略public的字段、属性
[DefaultValue(10)] 成员默认值(只能修饰值类型?)
[JsonProperty] 默认不会序列化private对象,加上这个修饰就可以序列化了
[JsonConverter] 继承自JsonConverter类,就可以按照自定义方式来序列化
[OptOut] 修饰类,所有公有成员会被序列化,成员加JsonIgnore不序列化
[OptIn] 修饰类,所有的成员不会被序列化,成员加JsonProperty序列化
举例:[JsonObject(MemberSerialization.OptIn)]
[JsonConverter(typeof(StringEnumConverter))] 枚举按照string类型来序列化
[DefaultValue(10)] 属性成员添加默认值
JsonSerializerSettings.DefaultValueHandling
JsonSerializerSettings.NullValueHandling 空值的处理,比如空值不序列化?
[JsonConverter(typeof(IsoDateTimeConverter))] 日期类型转换成Iso,或者自己继承一个
[JsonProperty(PropertyName = “CName”)] 自定义属性名称

常规序列化与反序列化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
string json= JsonConvert.SerializeObject(product);
Product product = JsonConvert.DeserializeObject<Product>(json);
//格式化json字符串
///<summary>
/// 格式化json字符串
///</summary>
/// <param name="str"></param>
/// <returns></returns>
public static string FormatJsonString(string str)
{
    JsonSerializer serializer = new JsonSerializer();
    TextReader tr = new StringReader(str);
    JsonTextReader jtr = new JsonTextReader(tr);
    object obj = serializer.Deserialize(jtr);
    if (obj != null)
    {
        StringWriter textWriter = new StringWriter();
        JsonTextWriter jsonWriter = new JsonTextWriter(textWriter)
        {
            Formatting = Formatting.Indented,
            Indentation = 4,
            IndentChar = ' '
        };
        serializer.Serialize(jsonWriter, obj);
        return textWriter.ToString();
    }
    else
    {
        return str;
    }
}

动态忽略某些属性不进行序列化(比如Vector3中的magnitude)

1.定义类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class JsonSettings
{
    static JsonSettings()
    {
        IgnoreSerializerProperty = new JsonSerializerSettings
        {
            ContractResolver = new IgnorePropertyContractResolver(new List<string> { "gamma", "linear", "grayscale","maxColorComponent",
            "magnitude", "sqrMagnitude" }),
        };
    }

    public static JsonSerializerSettings IgnoreSerializerProperty { get; set; }
    public class IgnorePropertyContractResolver : DefaultContractResolver
    {
        private readonly List<string> ignoreProperty;
        public IgnorePropertyContractResolver(List<string> ignoreProperty)

        {
            this.ignoreProperty = ignoreProperty;
        }
        protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
        {
            IList<JsonProperty> propertyList = base.CreateProperties(type, memberSerialization);
            propertyList = propertyList.Where(p => ignoreProperty.FirstOrDefault(o => o == p.PropertyName) == null).ToList();
            return propertyList;
        }
    }
}

3.使用自定义setting

1
JsonConvert.SerializeObject(xxx, JsonSettings.IgnoreSerializerProperty)

日期类型转成yyyy-MM-dd 或者yyyy-MM-dd HH:mm:ss格式

1
2
3
4
5
6
7
8
9
10
11
12
13
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);
}
}

LitJson

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Entity[] arr = JsonMapper.ToObject<Entity[]>(json);

string json = JsonMapper.ToJson(lstEntity);

JsonData data = new JsonData();

data["name"] = "peiandsky";

data["info"] = new JsonData();

data["info"]["sex"] = "male";

data["info"]["age"] = 28;

string json = data.ToJson();

SimpleJson

SimpleJson