1

JSON文字列を逆シリアル化するのに最も苦労しています。

リクエストで RootElement を指定するとうまく機能する RestSharp API を使用していました。その後、OAuth 機能のために Hammock に移行しましたが、逆シリアル化はそれほど簡単には機能しません。

DataContractJsonSerializer を使用してみました

DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(List)); var member = (List)ser.ReadObject(response.ContentStream);

しかし、これにより InvalidCastException が発生します。

JsonConvertを試してみました

var members = JsonConvert.DeserializeObject<List<Member>>(response.Content);

しかし、例外が発生します: JSON オブジェクトを型 'System.Collections.Generic.List`1[Member]' に逆シリアル化できません。

RestSharp は、ExecuteAsync を呼び出すときにこれを簡単に処理しました。 Client.ExecuteAsync<List<Member>>(request, (response) =>

私は途方に暮れています。たぶん、RestSharp の RootElement プロパティに相当する Hammock が必要ですか?? 私のJsonが変換しにくいだけですか?

ここに私のメンバーオブジェクトがあります

public partial class Member 
{
    public string State { get; set; }
    public string Joined { get; set; }
    public string lat { get; set; }
    public string Zip { get; set; }
    public string Bio { get; set; }
    public string Name { get; set; }
    public string City { get; set; }
    public string Id { get; set; }
    public string Link { get; set; }
    public string Country { get; set; }
    public string Visited { get; set; }
    public string Photo_url { get; set; }
    public string lon { get; set; }
}

ここにJsonがあります:

{
    "results": [
        {
            "zip": "11111",
            "lon": "-122.22000122070312",
            "photo_url": "http: //photos1.aaaaa.com/photos/member/1/6/c/e/member_4469838.jpeg",
            "link": "http: //www.aaaa.com/members/7804365",
            "state": "AA",
            "lang": "en_US",
            "city": "MyCity",
            "country": "us",
            "id": "7804365",
            "visited": "Sat Feb 19 02: 36: 40 EST 2011",
            "topics": [
                {
                    "id": 3340,
                    "urlkey": "pickupsoccer",
                    "name": "Pick-up Soccer"
                },
                {
                    "id": 468,
                    "urlkey": "dads",
                    "name": "Dads"
                },
                {
                    "id": 20557,
                    "urlkey": "coed-soccer",
                    "name": "Coed Soccer"
                },
                {
                    "id": 148421,
                    "urlkey": "windowsphone",
                    "name": "Windows Phone"
                }
            ],
            "joined": "Thu Aug 07 15: 32: 06 EDT 2008",
            "bio": "",
            "name": "aaa bbbb",
            "other_services": {
                "linkedin": {
                    "identifier": "http: //www.bbb.com/in/zzzzz"
                }
            },
            "lat": "47.790000915527344"
        }
    ],
    "meta": {
        "lon": "",
        "count": 1,
        "link": "https: //api.aaaaa.com/members",
        "next": "",
        "total_count": 1,
        "url": "https: //api.aaaaa.com/members?relation=self&order=name&offset=0&format=json&page=800",
        "id": "",
        "title": "Members",
        "updated": "Fri Sep 10 13: 08: 07 EDT 2010",
        "description": "API method",
        "method": "Members",
        "lat": ""
    }
}

UPDATE jsonの結果全体をカプセル化するMemberクラスのラッパーオブジェクトを追加すると、これが修正されました。

public partial class Members
{
    public List<Member> results { get; set; }
    public object meta { get; set; }
}

次に、次を使用して逆シリアル化できます。

var members = JsonConvert.DeserializeObject<Members>(jsonstring);
4

3 に答える 3

3

JSON データには、約 3 つの問題領域があります。

  1. ここに示されているように、JSON では機能しない多くのバックスラッシュと二重引用符が最初と最後に含まれています。あなたの質問から、これが VisualStudio デバッガーからコピーした結果なのか、それとも実際にデータの問題なのかを判断するのは困難です。

  2. 送信されるデータは、メンバー インスタンスのリストではなく、メンバー インスタンスのリストと追加のメタ情報の両方を含むオブジェクトです。そのため、2 つのメンバーresultsmetaを持つ追加のクラスを導入する必要があります。

  3. クラスMemberは大文字で始まるプロパティを使用しますが、JSON データはすべて小文字を使用します。プロパティ名を変更するか、データDataMemberアノテーションを使用できます。

したがって、解決策は次のようになります。

DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(JsonResponse));
JsonResponse jsonResponse = (JsonResponse)ser.ReadObject(response.ContentStream);

次のクラス定義を使用します。

[DataContract]
public partial class Member 
{
    [DataMember(Name = "state")]
    public string State { get; set; }
    [DataMember(Name = "joined")]
    public string Joined { get; set; }
    [DataMember(Name = "lat")]
    public string Lat { get; set; }
    [DataMember(Name = "zip")]
    public string Zip { get; set; }
    [DataMember(Name = "bio")]
    public string Bio { get; set; }
    [DataMember(Name = "name")]
    public string Name { get; set; }
    [DataMember(Name = "state")]
    public string City { get; set; }
    [DataMember(Name = "city")]
    public string Id { get; set; }
    [DataMember(Name = "link")]
    public string Link { get; set; }
    [DataMember(Name = "country")]
    public string Country { get; set; }
    [DataMember(Name = "visited")]
    public string Visited { get; set; }
    [DataMember(Name = "photo_url")]
    public string PhotoUrl { get; set; }
    [DataMember(Name = "lon")]
    public string Lon { get; set; }
}

[DataContract]
public class Meta
{
    [DataMember(Name = "lon")]
    public string Lon { get; set; }
    [DataMember(Name = "count")]
    public int Count { get; set; }
    [DataMember(Name = "link")]
    public string Link { get; set; }
    [DataMember(Name = "next")]
    public string Next { get; set; }
    [DataMember(Name = "total_count")]
    public int TotalCount { get; set; }
}

[DataContract]
public class JsonResponse
{
    [DataMember(Name = "results")]
    public List<Member> Results { get; set; }
    [DataMember(Name = "meta")]
    public Meta Meta { get; set; }
}
于 2011-02-20T12:37:29.797 に答える
2

私たちのプロジェクトでは、このために Hammok を使用しています。クラスを次のように変更してみてください。

[DataContract]
public partial class Member 
{
   [DataMember(Name="zip")]
   public string Zip { get; set; }
   [DataMember(Name="photo_url")]
   public string Photo_url { get; set; }
   //Etc.
}
于 2011-02-20T10:03:35.340 に答える
0

Json.net を使用してみてください。DataContractJsonSerializer があまりにも無力であることがわかりました。json.net は優れた機能を提供します。このリンクで見つけることができます

http://json.codeplex.com/

.dll ファイルとドキュメントも含まれています。Web ドキュメンテーション http://james.newtonking.com/projects/json/help/

于 2011-02-20T09:11:00.430 に答える