English 中文(简体)
获取牛顿软体的 Raw json 字符串。 Json 库
原标题:Get Raw json string in Newtonsoft.Json Library

我有这样的json

{
    "name": "somenameofevent",
    "type": "event",
    "data": {
        "object": {
            "age": "18",
            "petName": "18"
        },
        "desct": {
        }
    }
}

我有两个像这样的物体

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 进入某些Object, SomeDesct 属性? 在 JSON " data.object..." 是复杂的对象, 我想只让 RAW JSON 字符串到这些属性上。 你能帮我吗?

问题回答

你不需要写任何转换器, 只要使用 < a href=" http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_Linq_JRaw.htm" 如下:

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 序列到隐藏的属性, 并在存取器调用中进行字符串转换 。

您必须写入自定义转换器类( 来自 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 对象, 但返回该对象的序列版本为字符串。 上面有些高空, 因为该对象被解密为 < code> JObject , 然后又重新序列, 但对我来说这是最简单的方法。 也许你有更好的主意 。

我用这个执行"JsonConvert"这个惯例

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;
        }
    }
}

如果您担心该对象被降为 JObject a (然后又被序列化)(@fero 提供的“强度”解答),那么您可以尝试以下方法。

Approach 1 :创建您自己的自定义 JsonConverter 并覆盖 ReadJson

using(var jsonReader = new JsonTextReader(myTextReader))
{
  while(jsonReader.Read()){
    if(jsonReader.TokenType.PropertyName=="SomeDesct")
    {
      //do what you want
    } 
  }
}

详情请查看链接