-2

私はフランス人の学生で、学期のプロジェクトをしなければなりません。Instagram から (API を使用して) メディアを取得し、データベースに配置する必要があります。今のところ instasharp を使用しており、HttpClient クラスでリクエストを実行できます。

これは、JSON 要求の内容を含む文字列を返します。しかし、私は Mapper.cs という名前のクラスを見てきました。これは、要求の結果を instasharp の別のクラスと一致させる必要があります。たとえば、メディアを検索する場合、マッパー クラスは JSON 文字列を読み取り、メディアの適切なインスタンスを作成する必要があります。私はこの種のリクエストを行います: https://api.instagram.com/v1/media/search?lat=45.759723&lng=4.842223&distance=5000&client_id=My-Id&count=5

しかし、私にはよくわかりません.Mapperクラスが実際に何をするのかを誰かが教えてくれます.


これが Mapper クラスです。メソッドのすべてを理解していないため、使用できません。

 class Mapper {
    public static object Map<T>(string json) where T : new() {

        //var t = new T();
        var j = JObject.Parse(json);
        var t = typeof(T);

        try {
            var instance = Map(t, j);

            // add the pure json back
            if (instance != null) {
                var prop = instance.GetType().GetProperty("Json");
                if (prop != null) {
                    prop.SetValue(instance, json, null);
                }
            }

            return instance;

        } 
        catch (Exception ex) {
            Debug.WriteLine(ex.Message);
            return null;
        }
    }

    private static object Map(Type t, JObject json) {

            var instance = Activator.CreateInstance(t);

            Array.ForEach(instance.GetType().GetProperties(), prop => {

                var attribute = prop.GetCustomAttributes(typeof(Model.JsonMapping), false);

                if (attribute.Length > 0) {
                    var propertyType = prop.PropertyType;
                    var mapsTo = ((Model.JsonMapping)attribute[0]).MapsTo;
                    var mappingType = ((Model.JsonMapping)attribute[0]).MapType;

                    switch (mappingType) {
                        case Model.JsonMapping.MappingType.Class:
                            if (json[mapsTo] != null) {
                                if (json[mapsTo].HasValues) {
                                    var obj = Map(propertyType, (JObject)json[mapsTo]);
                                    prop.SetValue(instance, obj, null);
                                }
                            }
                            break;
                        case Model.JsonMapping.MappingType.Collection:
                            var col = Map(propertyType, (JArray)json[mapsTo]);
                            prop.SetValue(instance, col, null);
                            break;
                        default:
                            if (json != null) {
                                if (json[mapsTo] != null) {
                                    // special case for datetime because it comes in Unix format
                                    if (prop.PropertyType == typeof(DateTime))
                                        prop.SetValue(instance, UnixTimeStampToDateTime(json[mapsTo].ToString()), null);
                                    else
                                        prop.SetValue(instance, Convert.ChangeType(json[mapsTo].ToString(), prop.PropertyType), null);
                                }
                            }
                            break;
                    }
                }
            });

            return instance;
    }

    private static IList Map(Type t, JArray json) {
        var type = t.GetGenericArguments()[0];
        // This will produce List<Image> or whatever the original element type is
        var listType = typeof(List<>).MakeGenericType(type);
        var result = (IList)Activator.CreateInstance(listType);

        if (json != null) {
            foreach (var j in json)
                if (type.Name == "String" || type.Name == "Int32")
                    result.Add(j.ToString());
                else result.Add(Map(type, (JObject)j));
        }

        return result;
    }

    private static DateTime UnixTimeStampToDateTime(string unixTimeStamp) {
        // Unix timestamp is seconds past epoch
        double unixTime = Convert.ToDouble(unixTimeStamp);
        System.DateTime dtDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0);
        dtDateTime = dtDateTime.AddSeconds(unixTime).ToLocalTime();
        return dtDateTime;
    }

    private static void SetPropertyValue(PropertyInfo prop, object instance, object value) {
        prop.SetValue(instance, Convert.ChangeType(value, prop.PropertyType), null);
    }
}

そして、それは私が試したものですが、うまくいきません.

そして、これは「エラー539型または名前空間名 'メディア'が見つかりません(使用中のディレクティブまたはアセンブリ参照がありませんか?」

InstaSharp.Model.Media media = new InstaSharp.Model.Media();

InstaSharp.Mapper.Map<media>(reponse);

私はそのようなクラスを見たことがないので、Mapper クラスの使い方を本当に知りません (C# を使い始めたのはわずか 6 か月前です)。

4

1 に答える 1

0

Map<T>メソッドは型を想定しているため、mediaインスタンスではなく型ですmedia。使用法は次のようになります。

InstaSharp.Mapper.Map<InstaSharp.Model.Media>(response);

クラスの機能については、1 つの静的メソッドMap<T>(string)を公開し、JSON.net を使用してT、JSON からマップされたデータ値を持つ型のインスタンスに文字列パラメーターを逆シリアル化するように見えます。

List<T>ofが必要な場合はMedia、以前とほぼ同じことを行います。

InstaSharp.Mapper.Map<List<InstaSharp.Model.Media>>(response);

最後に、 の結果は であるため、Map<T>キャストobjectするかdynamic変数を使用して実際に何かを行う必要があります。

var x = (List<Model.Media>)Mapper.Map<List<Model.Media>>(response);

どのクラス プロパティがどの json プロパティにマップされるかを指定するには、属性をプロパティに追加し、属性オプションModel.JsonMappingを指定する必要があります。MapTo

[Model.JsonMapping(MapTo="someJsonProperty")]
public string SomeProperty {get;set;}
于 2015-05-05T19:32:51.037 に答える