15

私はこのような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 、 SomeDect プロパティに取得するにはどうすればよいですか? JSON "data.object ..." は複雑なオブジェクトであり、これらのプロパティに RAW JSON 文字列のみを取得したい。手伝って頂けますか ?

4

6 に答える 6

26

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 を非表示のプロパティにシリアル化し、代わりにアクセサー呼び出しで文字列変換を行います。

于 2015-12-08T07:14:51.767 に答える
7

Newtonsoft.Json.JsonConverterオブジェクト全体を読み取り、オブジェクトの JSON 文字列を返すようにデシリアライザーに指示するカスタム コンバーター クラス (から派生) を作成する必要があります。

次に、プロパティを属性で装飾する必要がありJsonConverterます。

[JsonConverter(typeof(YourCustomConverterClass))]
public string SomeObject { get; set; }

カスタム コンバーターの作成方法に関する Web 上の優れたチュートリアルがありますが、便宜上、コンバーターのコアは次のようになります。

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
    return JObject.Load(reader).ToString();
}

このメソッドは完全な JSON オブジェクトを読み取りますが、オブジェクトのシリアル化されたバージョンを文字列として返します。オブジェクトが a に逆シリアル化されてからJObject再度シリアル化されるため、少しオーバーヘッドがありますが、私にとってはこれが最も簡単な方法です。多分あなたはより良い考えを持っています。

于 2012-06-27T09:57:00.283 に答える
2

カスタム 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;
        }
    }
}
于 2014-12-05T08:13:16.313 に答える
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
    } 
  }
}

詳細については、C# でのインクリメンタル JSON 解析のリンクを確認してください。

アプローチ 2 : json 文字列を読み取り、文字列関数または正規表現関数を適用して目的の文字列を取得します。

于 2012-12-03T05:10:42.983 に答える
0

あなたの場合、 JsonConvert クラスの静的メソッドを直接使用できます

PopulateObject(文字列値、オブジェクト ターゲット、JsonSerializerSettings 設定);

于 2014-01-14T10:10:20.850 に答える