java 中的inputJson.toJSONString() 和c#中的不同

java 中的 inputJson.toJSONString()  

相当于将c#中的属性按照字符排序,如果为null的则去除,如果为decimal类型的去除.0后的结果进行序列化。

/// <summary>
/// 对象转json
/// </summary>
/// <param name="obj"></param>
/// <param name="ignoreNull">忽略null值</param>
/// <returns></returns>
public static string ObjectToJson(object obj, bool ignoreNull = false)
{
//时间类型格式化
NullValueHandling nullValueHandling = NullValueHandling.Include;
if (ignoreNull == true)
{
nullValueHandling = NullValueHandling.Ignore;//忽略值为null的项
}
var jSetting = new JsonSerializerSettings { NullValueHandling = nullValueHandling };
IsoDateTimeConverter dtConverter = new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd HH:mm:ss", };
jSetting.Converters.Add(dtConverter);
string json = JsonConvert.SerializeObject(obj, Formatting.Indented, jSetting);

//排序
var a = JObject.Parse(json);
var target = KeySort(a);

//去掉decimal 末尾 .0
JsonSerializerSettings s1 = new JsonSerializerSettings();
s1.Converters.Add(new DemoJson());
json = JsonConvert.SerializeObject(target, null, s1);

return json;
}
public class DemoJson : JsonConverter
{
private void dumpNumArray<T>(JsonWriter writer, T n)
{

var s = n.ToString();
if (s.EndsWith(".0"))
writer.WriteRawValue(s.Substring(0, s.Length - 2));
else if (s.Contains("."))
writer.WriteRawValue(s.TrimEnd('0').TrimEnd('.'));
else
writer.WriteRawValue(s);
}

public override void WriteJson(JsonWriter writer, object value,
JsonSerializer serializer)
{
Type t = value.GetType();
if (t == dblArrayType)
dumpNumArray<double>(writer, (double)value);
else if (t == decArrayType)
dumpNumArray<decimal>(writer, (decimal)value);
else
throw new NotImplementedException();
}

private Type dblArrayType = typeof(double);
private Type decArrayType = typeof(decimal);

public override bool CanConvert(Type objectType)
{
if (objectType == dblArrayType || objectType == decArrayType)
return true;
return false;
}

public override bool CanRead
{
get { return false; }
}

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

/// <summary>
/// 按照字母排序
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static SortedDictionary<string, object> KeySort(JObject obj)
{
var res = new SortedDictionary<string, object>();
foreach (var x in obj)
{
if (x.Value is JValue) res.Add(x.Key, x.Value);
else if (x.Value is JObject) res.Add(x.Key, KeySort((JObject)x.Value));
else if (x.Value is JArray)
{
var tmp = new SortedDictionary<string, object>[x.Value.Count()];
for (var i = 0; i < x.Value.Count(); i++)
{
tmp[i] = KeySort((JObject)x.Value[i]);
}
res.Add(x.Key, tmp);
}
}
return res;
}

原文地址:https://www.cnblogs.com/luoxiaoxiao102/p/14523456.html