0

Json.Net を使用して、次のフラグメントを変換して配列メンバーを平坦化することは可能ですか?

{
  "format": "json",
  "artist": "artist1",
  "description": [
    "description1",
    "description2"
  ]
}

このような :

{
  "format": "json",
  "artist": "artist1",
  "description": "description1",
  "description": "description2",
}

つまり、オブジェクトは辞書のように見えますが、重複キーが許可されています。

次のようなカスタム JsonConverter を使用しようとしました:

internal class MyConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var strings = (string[])value;
        foreach (var s in strings)
        {
            writer.WritePropertyName(writer.Path);
            writer.WriteValue(s);
        }
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(string[]);
    }
}

しかし、プロパティの名前を書き込むときに JsonWriterException が発生します。

状態 Property のトークン PropertyName は、無効な JSON オブジェクトになります。道 ''。

後で逆シリアル化する予定がないので、このような無効なオブジェクトを作成しても問題ありません。実際には、次の形式で URL パラメータ文字列を作成するために必要です。

format=json&artist=artist1&description=description1&description=description2

これを達成するためにJson.Netインフラストラクチャを使用しようとする価値はありますか?

4

1 に答える 1

0

問題に対する私の解決策は次のとおりです: JsonTextReader

private static string GetUrlParameters(string json)
{
    JsonTextReader reader = new JsonTextReader(new StringReader(json));
    string path = null;
    List<string> list = new List<string>();
    while (reader.Read())
    {
        JsonToken tokenType = reader.TokenType;
        switch (tokenType)
        {
            case JsonToken.PropertyName:
                path = reader.Path;
                break;
            case JsonToken.Integer:
            case JsonToken.Float:
            case JsonToken.String:
            case JsonToken.Boolean:
                string item = string.Format("{0}={1}", path, reader.Value);
                list.Add(item);
                break;
        }
    }
    return string.Join("&", list);
}
于 2013-05-24T21:13:35.210 に答える