В вашем коде есть как минимум две проблемы. Первый: вы делаете сериализацию JSON дважды . Второе: вы не можете добавить строку JSON с другими данными, потому что в результате строка не будет больше в формате JSON.
Если вы используете атрибут [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
для веб-метода, возвращаемый вами объект будет автоматически сериализован в строку JSON . Таким образом, вы должны не сериализовать его вручную раньше.
Если объект, который вы хотите сериализовать, уже является строкой, то во время сериализации все предложения будут отменены ("
будет заменено на \"
). В вашем случае после ручной сериализации объекта вы получили строку [{"__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 }
В конце вы возвращаете строку в результате веб-метида и получаете результат в виде {d: result}
, где все квоты будут экранированы:
{
"d": "[{\"__type\":\"User:#HagarDB\", \"ID\":1}], \"SecurityGroup\": 1"
}
Это строка JSON, но это не то, что вам нужно.
Решение вашей проблемы очень простое. Ваш веб-метод может выглядеть следующим образом
[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; }
}