コードには少なくとも 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; }
}