zoukankan      html  css  js  c++  java
  • 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;
    }

  • 相关阅读:
    iOS Provisioning Profile(Certificate)与Code Signing详解
    FW 常见的性能测试工具有: loadRunner/netperf/httperf/apache_ab/Apache JMeter
    android Instrumentation 转载
    FW 编译Android系统源码和内核源码
    FW 每秒百万级别的 HTTP 请求 sung: 重型的(heavy-duty)、分布式的、多协议测试工具
    Docker Hub Mirror
    MinGW安装和使用
    jdk,maven,tomcat 的环境配置
    错误400-The request sent by the client was syntactically incorrect
    pom.xml
  • 原文地址:https://www.cnblogs.com/luoxiaoxiao102/p/14523456.html
Copyright © 2011-2022 走看看