0

ここに私の最初の投稿:)

私は夏の仕事で少しコーディングをしています-私はまだプロではありません!

このiPhoneアプリをAndroidに変換していますが、ほぼ完了しています。この作品を変換するのに苦労しています。

'participants'の配列は、JSONを介してサーバーに渡されます。これは、Androidでは、HashMapの配列のように見えます。あれは正しいですか?

これがObjectiveCです。

NSMutableArray *participants = [[NSMutableArray alloc] init];

NSArray *listOfParticipants = [[game getListOfGameParticipants]allValues];

for (Player *playerObj in listOfParticipants)
{
    NSMutableDictionary *playerToAdd = [[NSMutableDictionary alloc] init];
    if ([playerObj.email length] == 0) {
        [playerToAdd setValue:playerObj.phoneNumber forKey:@"Id"];
    }
    else
    {
        [playerToAdd setValue:playerObj.email forKey:@"Id"];
    }

    [playerToAdd setValue:playerObj.firstName forKey:@"FirstName"];
    [playerToAdd setValue:playerObj.lastName forKey:@"LastName"];
    [playerToAdd setValue:playerObj.phoneNumber forKey:@"PhoneNumber"];

    [participants addObject:playerToAdd];

    [playerToAdd release];
}

getListOfGameParticipantsは次のとおりです。

- (NSDictionary*) getListOfGameParticipants
{
return participants ;
}

私が試したAndroidコードは次のとおりです。

ArrayList<Map<String, String>> list = new ArrayList<Map<String, String>>();
Map<String, String> playersObject = new HashMap<String, String>();
            playersObject.put("Id", "test@test.net");
            playersObject.put("FirstName", "Test Firstname");
            playersObject.put("LastName", "Test Surname");
            playersObject.put("PhoneNumber", "Test Number");
            list.add(playersObject);
json.put("ParticipantIds", list);

助けてください :)

編集:それは動作しません。サーバーは次のように報告します。

The server encountered an error processing the request. The exception message is 'Expecting state 'Element'.. Encountered 'Text'  with name '', namespace ''. '. See server logs for more details.

予想されるデータ型は次のとおりです。

[DataMember]
public Player[] ParticipantIds { get; set; }

編集:さらなる更新:

これで、ハッシュマップの配列が適切な形式のJSON文字列に解析されました。そのJSON文字列をJSONObjectに解析し、そのJSONObjectをJSONArrayに配置する必要があります。

次のコードは機能しません。

Map<String, String> playersObject = new HashMap<String, String>();
            playersObject.put("PhoneNumber", "TestNumber");
            playersObject.put("Id", "test@test.net");
            playersObject.put("FirstName", "Test Firstname");
            playersObject.put("LastName", "Test Surname");
            ArrayList<Map<String, String>> list = new ArrayList<Map<String, String>>();
            list.add(playersObject);
            String jsonValue = org.json.simple.JSONValue.toJSONString(list);
            JSONObject hashMapObject = new JSONObject();
            hashMapObject.getString(jsonValue);
            JSONArray hashMapArray = new JSONArray(jsonValue);
            hashMapArray.put(hashMapObject);

エラーが発生します:

org.json.JSONException: No value for [{"LastName":"Test Surname","FirstName":"Test Firstname","Id":"test@test.net","PhoneNumber":"TestNumber"}]

ヘルプ!

4

1 に答える 1

0

AndroidコードはiPhoneコードと同じことをしませんが、データ構造に関する限り、それは正しいようです。2つの方法で生成されたJSONを比較するだけで、何が問題なのかがわかります。

これは、iPhoneが生成しているJSONコードです。

[
    {
        "Id" : "value",
        "FirstName" : "value",
        "LastName" : "value",
        "PhoneNumber" : "value"
    },
    {
        "Id" : "value",
        "FirstName" : "value",
        "LastName" : "value",
        "PhoneNumber" : "value"
    },
    {
        "Id" : "value",
        "FirstName" : "value",
        "LastName" : "value",
        "PhoneNumber" : "value"
    }
]

Androidコードが同じものを生成していることを確認してください。

編集:

JavaでJSONを手動で生成するためのコードは次のようになります。

String json = "[";

for (Player player : participants) {
    json += "{";
    json += "\"Id\":\"" + (player.email.length() > 0 ? player.email : player.phoneNumber) + "\",";
    json += "\"FirstName\":\"" + player.firstName + "\",";
    json += "\"LastName\":\"" + player.lastName + "\",";
    json += "\"PhoneNumber\":\"" + player.phoneNumber + "\"";
    json += "},";
}

json = json.substring(0, json.length()-1) + "]";

私はJavaコードをあまり頻繁に記述しませんが、上記はあなたが投稿したObjective-Cコードと同じJSONを生成すると思います。インデントされていませんが、サーバーは気にしないと思います。

于 2012-06-15T22:04:05.797 に答える