问题描述
string s="{"size":15,"query":{"match":{"data.query.match.promotionInfo.query":{"boost":1.3,"type":"phrase","query":"销售1"}}}}";var o = JsonConvert.DeserializeObject<dynamic>(s);//data.query.match.promotionInfo.query 需处理掉 "."
问题解答
回答1:/// /// 自定义序列化和反序列化转换器 /// public class CustomJsonConverter : JsonConverter { /// /// 用指定的值替换空值NULL /// public object PropertyNullValueReplaceValue { get; set; } /// /// 属性名称命名规则约定 /// public ConverterPropertyNameCase PropertyNameCase { get; set; } /// /// 自定义属性名称映射规则 /// public Func ProperyNameConverter { get; set; } /// /// 从字符流读取对象 /// public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { using (JTokenWriter writer = new JTokenWriter()) { JsonReaderToJsonWriter(reader, writer); return writer.Token.ToObject(objectType); } } /// /// 通过对象写字符流 /// public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { JObject jobject = JObject.FromObject(value); JsonReader reader = jobject.CreateReader(); JsonReaderToJsonWriter(reader, writer); } public void JsonReaderToJsonWriter(JsonReader reader, JsonWriter writer) { do { switch (reader.TokenType) { case JsonToken.None: break; case JsonToken.StartObject: writer.WriteStartObject(); break; case JsonToken.StartArray: writer.WriteStartArray(); break; case JsonToken.PropertyName: string propertyName = reader.Value.ToString(); writer.WritePropertyName(ConvertPropertyName(propertyName)); break; case JsonToken.Comment: writer.WriteComment((reader.Value != null) ? reader.Value.ToString() : null); break; case JsonToken.Integer: writer.WriteValue(Convert.ToInt64(reader.Value, CultureInfo.InvariantCulture)); break; case JsonToken.Float: object value = reader.Value; if (value is decimal) { writer.WriteValue((decimal)value); } else if (value is double) { writer.WriteValue((double)value); } else if (value is float) { writer.WriteValue((float)value); } else { writer.WriteValue(Convert.ToDouble(value, CultureInfo.InvariantCulture)); } break; case JsonToken.String: writer.WriteValue(reader.Value.ToString()); break; case JsonToken.Boolean: writer.WriteValue(Convert.ToBoolean(reader.Value, CultureInfo.InvariantCulture)); break; case JsonToken.Null: if (this.PropertyNullValueReplaceValue != null) { writer.WriteValue(this.PropertyNullValueReplaceValue); } else { writer.WriteNull(); } break; case JsonToken.Undefined: writer.WriteUndefined(); break; case JsonToken.EndObject: writer.WriteEndObject(); break; case JsonToken.EndArray: writer.WriteEndArray(); break; case JsonToken.EndConstructor: writer.WriteEndConstructor(); break; case JsonToken.Date: if (reader.Value is DateTimeOffset) { writer.WriteValue((DateTimeOffset)reader.Value); } else { writer.WriteValue(Convert.ToDateTime(reader.Value, CultureInfo.InvariantCulture)); } break; case JsonToken.Raw: writer.WriteRawValue((reader.Value != null) ? reader.Value.ToString() : null); break; case JsonToken.Bytes: if (reader.Value is Guid) { writer.WriteValue((Guid)reader.Value); } else { writer.WriteValue((byte[])reader.Value); } break; } } while (reader.Read()); } /// /// 自定义转换器是否可用 /// public override bool CanConvert(Type objectType) { if (objectType != typeof(DateTime)) { return true; } else { return false; } } /// /// 根据外部规则转换属性名 /// private string ConvertPropertyName(string propertyName) { if (this.ProperyNameConverter != null) { propertyName = this.ProperyNameConverter(propertyName); } char[] chars = propertyName.ToCharArray(); switch (this.PropertyNameCase) { case ConverterPropertyNameCase.None: break; case ConverterPropertyNameCase.CamelCase: for (int i = 0; i y.Replace('.', '_')}; o = JsonConvert.DeserializeObject(s, convert);