Разбор Yahoo!Ответ Placemaker JSON с использованием JavaScriptSerializer - PullRequest
0 голосов
/ 07 января 2012

У меня проблема с анализом ответа JSON, отправленного из Yahoo!Placemaker.Мне нужен только список LocalScopes.

Мои определения классов следующие:

public class PlacemakerResponse
{

    public Document document { get; set; }

    public class Document
    {
        public List<LocalScope> localScopes { get; set; }
    }

}

public class LocalScope
{

    public String woeId { get; set; }
    public String name { get; set; }
    public Centroid centroid { get; set; }

    public class Centroid
    {
        public String latitude { get; set; }
        public String longitude { get; set; }
    }

}

Полная строка JSON следующая.Я проверил его на JSONLint , и все выглядит следующим образом.

{
    "processingTime": "0.00191",
    "version": " build 110725",
    "documentLength": "36",
    "document": {
        "0": {
            "placeDetails": {
                "placeId": "1",
                "place": {
                    "woeId": "483446",
                    "type": "Town",
                    "name": "Misida, Malta Majjistral, MT",
                    "centroid": {
                        "latitude": "35.8956",
                        "longitude": "14.4892"
                    }
                },
                "placeReferenceIds": "1",
                "matchType": "0",
                "weight": "1",
                "confidence": "10"
            }
        },
        "1": {
            "placeDetails": {
                "placeId": "2",
                "place": {
                    "woeId": "2450022",
                    "type": "Town",
                    "name": "Miami, FL, US",
                    "centroid": {
                        "latitude": "25.729",
                        "longitude": "-80.2374"
                    }
                },
                "placeReferenceIds": "2",
                "matchType": "0",
                "weight": "1",
                "confidence": "10"
            }
        },
        "administrativeScope": {
            "woeId": "0",
            "type": "Undefined",
            "name": "",
            "centroid": {
                "latitude": "0",
                "longitude": "0"
            }
        },
        "geographicScope": {
            "woeId": "1",
            "type": "Supername",
            "name": "Earth",
            "centroid": {
                "latitude": "0",
                "longitude": "0"
            }
        },
        "localScopes": [
            {
                "localScope": {
                    "woeId": "483446",
                    "type": "Town",
                    "name": "Misida, Malta Majjistral, MT (Town)",
                    "centroid": {
                        "latitude": "35.8956",
                        "longitude": "14.4892"
                    },
                    "southWest": {
                        "latitude": "35.8893",
                        "longitude": "14.472"
                    },
                    "northEast": {
                        "latitude": "35.9109",
                        "longitude": "14.4986"
                    },
                    "ancestors": [
                        {
                            "ancestor": {
                                "woeId": "24551414",
                                "type": "Locality",
                                "name": "Msida"
                            }
                        },
                        {
                            "ancestor": {
                                "woeId": "56043491",
                                "type": "Region",
                                "name": "Malta Majjistral"
                            }
                        },
                        {
                            "ancestor": {
                                "woeId": "23424897",
                                "type": "Country",
                                "name": "Malta"
                            }
                        }
                    ]
                }
            },
            {
                "localScope": {
                    "woeId": "2450022",
                    "type": "Town",
                    "name": "Miami, FL, US (Town)",
                    "centroid": {
                        "latitude": "25.729",
                        "longitude": "-80.2374"
                    },
                    "southWest": {
                        "latitude": "25.5403",
                        "longitude": "-80.4469"
                    },
                    "northEast": {
                        "latitude": "25.9578",
                        "longitude": "-80.028"
                    },
                    "ancestors": [
                        {
                            "ancestor": {
                                "woeId": "12587815",
                                "type": "County",
                                "name": "Miami-Dade"
                            }
                        },
                        {
                            "ancestor": {
                                "woeId": "2347568",
                                "type": "State",
                                "name": "Florida"
                            }
                        },
                        {
                            "ancestor": {
                                "woeId": "23424977",
                                "type": "Country",
                                "name": "United States"
                            }
                        }
                    ]
                }
            }
        ],
        "extents": {
            "center": {
                "latitude": "35.8956",
                "longitude": "14.4892"
            },
            "southWest": {
                "latitude": "25.5403",
                "longitude": "-80.4469"
            },
            "northEast": {
                "latitude": "35.9109",
                "longitude": "14.4986"
            }
        },
        "referenceList": [
            {
                "reference": {
                    "woeIds": "483446",
                    "placeReferenceId": "1",
                    "placeIds": "1",
                    "start": "20",
                    "end": "25",
                    "isPlaintextMarker": "1",
                    "text": "Msida",
                    "type": "plaintext",
                    "xpath": ""
                }
            },
            {
                "reference": {
                    "woeIds": "2450022",
                    "placeReferenceId": "2",
                    "placeIds": "2",
                    "start": "30",
                    "end": "35",
                    "isPlaintextMarker": "1",
                    "text": "Miami",
                    "type": "plaintext",
                    "xpath": ""
                }
            }
        ]
    }
}

Когда я делаю: List<LocalScope> places = (ser.Deserialize<PlacemakerResponse>(stringJSON)).document.localScopes;

Список мест имеет два объекта LocalScope, какв строке JSON (пока все хорошо), НО все три члена (woeId, name, centroid) установлены в null !!

Я использовал JavaScriptSerializer много раз раньше и никогда не возникало проблем,У кого-нибудь есть предложения по поводу того, что я делаю неправильно?

Спасибо.

1 Ответ

1 голос
/ 07 января 2012

Я думаю, что вы должны изменить ваши классовые объявления следующим образом

public class PlacemakerResponse
{

    public Document document { get; set; }

    public class Document
    {
        public List<AnotherPlacemaker> localScopes { get; set; }
    }

}

public class AnotherPlacemaker
{
    public LocalScope LocalScope;
}


public class LocalScope
{

    public String woeId { get; set; }
    public String name { get; set; }
    public Centroid centroid { get; set; }

    public class Centroid
    {
        public String latitude { get; set; }
        public String longitude { get; set; }
    }

}

Если вы хотите использовать Json.Net, вы можете написать свой код, как показано ниже, без объявления этих уродливых объектов

dynamic yahooObj =  JsonUtils.JsonObject.GetDynamicJsonObject(yourstring);
foreach (var item in yahooObj.document.localScopes)
{
    Console.WriteLine(
        item.localScope.woeId + " " + 
        item.localScope.name + " " + 
        item.localScope.centroid.latitude + " " + 
        item.localScope.centroid.longitude);
}
...