0

DataContractJsonSerializer を使用してオブジェクトを json にシリアル化し、AJAX を使用してクライアントに返します。ここで、別のオブジェクトをシリアライズして、一緒に返す必要があります。問題は、JSON をラップする MS の "d" です。これにより、文字列を単純に連結して 1 つの JSON 文字列にすることができなくなります。

json = json & """,""SecurityGroups"": 1"

戻り値:

{
    "d":"[{
        \"__type\":\"User:#HagarDB\",
        \"ID\":1
    }]\",
    \"SecurityGroup\": 1"
}

どんな提案でも大歓迎です。他のオブジェクトを取得するためにサーバーに別の呼び出しを行う必要はありません。

4

2 に答える 2

0

コードには少なくとも 2 つの問題があります。1 つ目: JSON シリアル化を 2 回行います。2 つ目: 結果の文字列は JSON 形式ではないため、JSON 文字列に別のデータを追加することはできません。

[ScriptMethod(ResponseFormat = ResponseFormat.Json)]Web メソッドに属性を使用すると、返されたオブジェクトは自動的に JSON string にシリアライズされます。そのため、前に手動でシリアライズしないでください。

シリアライズしたいオブジェクトがすでに文字列である場合、シリアライズ中にすべてのクォートをエスケープする必要があります ("に置き換えられます\")。あなたの場合、手動でオブジェクトをシリアル化した後、[{"__type":"User:#HagarDB", "ID":1}]正しい JSON 文字列である文字列を受け取りました。これを確認するには、バリデータhttp://www.jsonlint.com/に文字列を貼り付けます。JSON 形式の詳細については、http://www.json.org/を参照してください。

"SecurityGroup": 1データに別の文字列(JSON 文字列ではありません。正しいのは)を追加すると{"SecurityGroup": 1}、文字列の間にカンマが入り、文字列が返されます。

[{"__type":"User:#HagarDB", "ID":1}], "SecurityGroup": 1

これも間違った JSON です。正しいJSONは次のようになります

{ "MyArray": [ {"__type": "User:#HagarDB", "ID": 1 } ], "SecurityGroup": 1 }

最後に、web メソッドの結果として文字列を返し、{d: result}すべてのクォータがエスケープされる形式で結果を受け取ります。

{
    "d": "[{\"__type\":\"User:#HagarDB\", \"ID\":1}], \"SecurityGroup\": 1"
}

これは JSON 文字列ですが、必要なものではありません。

あなたの問題の解決策は非常に簡単です。Web メソッドは次のようになります

[WebMethod, ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public MyResult MyMethod () {
    List<Users> users = BuildMyInnerInformation();
    return new MyResult { Users: users, SecurityGroup: 1};
}

public class MyResult {
    public List<Users> Users { get; set; }
    public int SecurityGroup { get; set; }
}
于 2010-09-06T08:44:43.237 に答える
0

RPM1984 がコメントで示唆しているように、おそらく最良の解決策は、シリアル化する両方のオブジェクトを含むクラスを作成することです。

何らかの理由でそれができない場合は、簡単な文字列操作を行って新しいオブジェクトを挿入できます。

// Find position of the ending characters }] 
var endPosition = json.IndexOf("}]");
// Insert the new json between the } and the ]
var newJson = json.Substring(0, endPosition +1) + newJson + json.Substring(endPosition);

新しいjsonの前にコンマを追加する必要があるかもしれませんし、文字列インデックスを微調整する必要があるかもしれませんが、要点はわかります. json は単純な文字列形式なので、文字列として扱うこともできます。

この最後の提案は非常に醜いですが、1 回限りの解決策として機能するはずです。

于 2010-09-06T06:49:45.480 に答える