json_encode удаляют кавычки из ключей?

Если я использую json_encode () на массиве как это:

return json_encode(array( 'foo' => 'bar'));

Возврат:

{'foo' : 'bar'}

Ключ передается как литерал, и это сбивает с толку мой сценарий. То, в чем я действительно нуждаюсь:

{ foo : 'bar' }

json_encode делает это, или я должен разделить кавычки сам с некоторым ужасным regex?

6
задан 3 February 2010 в 17:32
поделиться

4 ответа

Я проходил http://bradwilson.typepad.com/blog/2009/04/dataannotations-and-aspnet-mvc.html , в этом посте мне не понравилась идея поставить проверочные тесты в тест контроллера и несколько вручную проверить в каждом тесте, что если атрибут проверки существует или нет. (который имеет атрибуты метаданных, по причине того, что мы не можем применять атрибуты к автоматически генерируемым классам EDM) и объекты POCO, к свойствам которых применены атрибуты ValidationAttributes.

Вспомогательный метод не разбивается на иерархические объекты, но проверка может быть проверена на плоских отдельных объектах (Type-level)

class TestsHelper
{

    internal static void ValidateObject<T>(T obj)
    {
        var type = typeof(T);
        var meta = type.GetCustomAttributes(false).OfType<MetadataTypeAttribute>().FirstOrDefault();
        if (meta != null)
        {
            type = meta.MetadataClassType;
        }
        var propertyInfo = type.GetProperties();
        foreach (var info in propertyInfo)
        {
            var attributes = info.GetCustomAttributes(false).OfType<ValidationAttribute>();
            foreach (var attribute in attributes)
            {
                var objPropInfo = obj.GetType().GetProperty(info.Name);
                attribute.Validate(objPropInfo.GetValue(obj, null), info.Name);
            }
        }
    }
}

 /// <summary>
/// Link EDM class with meta data class
/// </summary>
[MetadataType(typeof(ServiceMetadata))]
public partial class Service
{
}

/// <summary>
/// Meta data class to hold validation attributes for each property
/// </summary>
public class ServiceMetadata
{
    /// <summary>
    /// Name 
    /// </summary>
    [Required]
    [StringLength(1000)]
    public object Name { get; set; }

    /// <summary>
    /// Description
    /// </summary>
    [Required]
    [StringLength(2000)]
    public object Description { get; set; }
}


[TestFixture]
public class ServiceModelTests 
{
    [Test]
    [ExpectedException(typeof(ValidationException), ExpectedMessage = "The Name field is required.")]
    public void Name_Not_Present()
    {
        var serv = new Service{Name ="", Description="Test"};
        TestsHelper.ValidateObject(serv);
    }

    [Test]
    [ExpectedException(typeof(ValidationException), ExpectedMessage = "The Description field is required.")]
    public void Description_Not_Present()
    {
        var serv = new Service { Name = "Test", Description = string.Empty};
        TestsHelper.ValidateObject(serv);
    }

}

это еще одна запись http://johan.driessen.se/archive/2009/11/18/testing-dataannotation-based-validation-in-asp.net-mvc.aspx , в которой говорится о проверке в .Net 4, но я думаю, что я собираюсь придерживаться моего вспомогательного метода, который действителен как в 3,5, так и в 4

-121--926211-

Попробуйте добавить.. «/» в начале URI. Например:

../images/outbound-blue.png

.. «/» в начале URI подсказывает браузеру подниматься на один уровень в родительский каталог, а затем искать в каталоге images . В настоящее время набор поиск подкаталога с именем images в каталоге, содержащем таблицы стилей.

-121--2762242-

При тестировании этой части кода:

echo json_encode(array( 'foo' => 'bar'));
die;

получается:

{"foo":"bar"}

Что является допустимым JSON.

(Обратите внимание, что это двойные кавычки, а не простые кавычки, как вы разместили)


Выход, который вы просите:

{ foo : 'bar' }

является допустимым Javascript, но не является допустимым JSON -- так что json _ encode не вернет это.

Описание формата JSON см. в json.org - это подмножество Javascript, а не сам Javascript.


Вместо того, чтобы « лишать себя цитат каким-то уродливым регексом », вы должны адаптировать свой код, поэтому он принимает действительный JSON: это намного лучше, на мой взгляд.

14
ответ дан 8 December 2019 в 14:43
поделиться

Всем спасибо. Я не знал этого о спецификации JSON. На самом деле проблема заключалась в моем скрипте, потому что я не установил тип данных моей функции $ .ajax () на "json"

. То, что я узнал сегодня, - JSON и Javascript - это не одно и то же!

0
ответ дан 8 December 2019 в 14:43
поделиться

Вопреки какой документация для NetworkStream. Читать , подразумевает, поток, полученный из , TcpClient делает не , просто возвращение 0 для числа байтов читало, когда нет никаких доступных данных - это блокирует.

Если вы посмотрите документация для TcpClient, то вы будете видеть эту линию:

класс TcpClient предоставляет простые методы для соединения, отправки и получения данных о потоке по сети в синхронный метод блокирования.

Теперь я думаю, что если ваш Read вызов блокируется, это потому, что сервер решил не отправлять какие-либо данные обратно. Вероятно, это связано с тем, что первоначальный запрос не проходит должным образом.

Мое первое предложение состоит в том, чтобы исключить StreamWriter в качестве возможной причины (то есть, буферизация/кодирование нюансов) и записать непосредственно в поток с помощью метода StartStream.Write . В этом случае убедитесь, что для StreamWriter используются правильные параметры.

Второе предложение состоит в том, чтобы не зависеть от результата вызова Read , чтобы разорвать петлю. Для класса StartStream задано свойство DataAvailable . Правильный способ записи цикла приема:

NetworkStream netStream = client.GetStream();
int read = 0;
byte[] buffer = new byte[1024];
StringBuilder response = new StringBuilder();
do
{
    read = netStream.Read(buffer, 0, buffer.Length);
    response.Append(Encoding.ASCII.GetString(buffer, 0, read));
}
while (netStream.DataAvailable);
-121--3603183-

Я рассмотрел аналогичную проблему с использованием нескольких методов хеширования. Я также использовал подход кодирования типа хеш-метода в базе данных (т.е. "альфа", "бета", "гамма", "дельта"). Я пометил все текущие хеши соответствующим уровнем. Как пользователи вошли в систему, я проверил их пароли и повторно хэшировал их с помощью обновленных методов. Срок действия наших паролей истекает через 90 дней, поэтому это был просто вопрос сохранения в течение 3 месяцев, пока все пароли, использующие старые методы, не могут быть сброшены.

-121--2747220-

Нет, json _ encode не сделает этого для вас. Спецификация json , в частности, требует, чтобы ключи приводились в кавычки. Это сделано для обеспечения того, что ключи, являющиеся зарезервированными словами javascript, не разрывают объект данных.

2
ответ дан 8 December 2019 в 14:43
поделиться

Как это отключает ваш скрипт?

И в соответствии со спецификацией JSON , ключевые имена предполагаются как строки. Второй фрагмент, который вы разместили, не является действительным JSON.

0
ответ дан 8 December 2019 в 14:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: