我有这样的json
{
"name": "somenameofevent",
"type": "event",
"data": {
"object": {
"age": "18",
"petName": "18"
},
"desct": {
}
}
}
我有2个像这样的对象
public class CustEvent
{
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("type")]
public string EventType{ get; set; }
[JsonProperty("data")]
public SomeData Data{ get; set; }
}
public class SomeData
{
[JsonProperty("object")]
public String SomeObject { get; set;}
[JsonProperty("dsct")]
public String SomeDesct { get; set; }
}
我用来解析json对象Newtonsoft.NET库。以及如何将RAW JSON转换为SomeObject,SomeDesct属性?在JSON中,“data.object ...”是复杂的对象,我想只获得RAW JSON String到这些属性。你能救我吗?
答案 0 :(得分:14)
您不需要编写任何转换器,只需使用JRaw
类型,如下所示:
public class SomeData
{
[JsonProperty("object")]
public JRaw SomeObject { get; set;}
[JsonProperty("dsct")]
public JRaw SomeDesct { get; set; }
}
然后,您可以通过检查.Value
属性
var rawJsonDesct = (string)data.SomeDesct.Value;
如果要保留string
签名,只需将JSON序列化为隐藏属性,然后在访问者调用中进行字符串转换。
答案 1 :(得分:5)
您必须编写一个自定义转换器类(派生自Newtonsoft.Json.JsonConverter
),它指示反序列化器读取整个对象并返回该对象的JSON字符串。
然后你必须用JsonConverter
属性装饰属性。
[JsonConverter(typeof(YourCustomConverterClass))]
public string SomeObject { get; set; }
网上有很多关于如何创建自定义转换器的教程,但是 - 为方便起见 - 转换器的核心可能如下所示:
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return JObject.Load(reader).ToString();
}
此方法读取完整的JSON对象,但将对象的序列化版本作为字符串返回。有一些开销,因为对象被反序列化为JObject
然后再次序列化,但对我来说这是最简单的方法。也许你有更好的主意。
答案 2 :(得分:2)
如果您担心开销,因为该对象被反序列化为JObject
a然后再次序列化( @fero 提供的解决方案),那么您可以尝试以下操作。
方法1 :创建自己的自定义JsonConverter
并覆盖ReadJson
using(var jsonReader = new JsonTextReader(myTextReader))
{
while(jsonReader.Read()){
if(jsonReader.TokenType.PropertyName=="SomeDesct")
{
//do what you want
}
}
}
有关详细信息,请查看链接Incremental JSON Parsing in C#
方法2 :读取json字符串并应用字符串函数或正则表达式函数来获取所需的字符串。
答案 3 :(得分:0)
在您的情况下,您可以直接使用JsonConvert类中的静态方法
PopulateObject(字符串值,对象目标,JsonSerializerSettings设置);
答案 4 :(得分:0)
我使用自定义JsonConverter的这个实现。
public class RawJsonConverter: JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(string);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var sb = new StringBuilder();
JsonToken previousToken = JsonToken.None;
if (reader.TokenType == JsonToken.StartObject)
{
sb.Append('{');
int depth = 1;
while (depth > 0)
{
if (!reader.Read())
break;
switch (reader.TokenType)
{
case JsonToken.PropertyName:
if (previousToken == JsonToken.Boolean || previousToken == JsonToken.Integer || previousToken == JsonToken.Float)
sb.Append(',');
sb.AppendFormat("\"{0}\":", reader.Value);
break;
case JsonToken.StartArray:
if (previousToken == JsonToken.EndArray)
sb.Append(',');
sb.Append('[');
break;
case JsonToken.Boolean:
case JsonToken.Integer:
case JsonToken.Float:
if (previousToken == JsonToken.Boolean || previousToken == JsonToken.Integer || previousToken == JsonToken.Float)
sb.Append(',');
sb.AppendFormat(System.Globalization.CultureInfo.InvariantCulture, "{0}", reader.Value);
break;
case JsonToken.EndArray:
sb.Append(']');
break;
case JsonToken.StartObject:
sb.Append('{');
depth++;
break;
case JsonToken.EndObject:
sb.Append('}');
depth--;
break;
}
previousToken = reader.TokenType;
}
}
return sb.ToString();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteRawValue(value.ToString());
}
public override bool CanWrite
{
get
{
return true;
}
}
}
答案 5 :(得分:0)
作为chakrit suggested,您可以执行类似的操作,为您的对象提供字符串签名,同时使用JRaw进行实际工作。
[JsonProperty("Data")]
public JRaw Raw { get; set; }
[JsonIgnore]
public string Data
{
get => Raw?.Value as string;
set => Raw = new JRaw(value);
}