2014-12-29 5 views
-1

Кто-нибудь знает, как сериализовать объект как следующий код с помощью Json.NET?Сериализовать объект с использованием Json.NET с допустимым форматом javascript

class Program 
{ 
    static void Main(string[] args) 
    { 
     var dic = new Dictionary<string, object>(); 
     dic.Add("key", true); 
     dic.Add("create", false); 
     dic.Add("title", "Name"); 
     dic.Add("option2", @"function(value){ return value; }"); 
     dic.Add("fields", new Dictionary<string, object> 
     { 
      {"Id", new Dictionary<string, object> 
        { 
         {"title", "This is id"} 
        } 
      } 
     }); 
     Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(dic, Formatting.Indented)); 
    } 
} 

выхода Результата является JSON строки:

{ 
    "key": true, 
    "create": false, 
    "title": "Name", 
    "option2": "function(value){ return value; }", 
    "fields": { 
    "Id": { 
     "title": "This is id" 
    } 
    } 
} 

Но я ожидаю, как следующий код (он выглядит яваскрипт хэш):

{ 
    key: true, 
    create: false, 
    title: "Name", 
    option2: function(value){ return value; }, 
    fields: { 
    Id: { 
     title: "This is id" 
    } 
    } 
} 

Код ниже покажет как я ожидаю. Но мне нужно другое решение. Пожалуйста, помогите мне. Спасибо

private static void SerializeObject(IDictionary<string, object> dic) 
    { 
     Console.WriteLine("{"); 
     foreach (var key in dic.Keys) 
     { 
      var value = dic[key]; 
      if (value is JsFunction) // just a wrapper class of string 
      { 
       Console.WriteLine("{0}: {1}", key, value); 
      } 
      else if (value is IDictionary<string, object>) 
      { 
       Console.WriteLine("{0}:", key); 
       SerializeObject(value as IDictionary<string, object>); 
      } 
      else 
      { 
       Console.WriteLine("{0}: {1}", key, JsonConvert.SerializeObject(dic[key])); 
      } 
     } 
     Console.WriteLine("}"); 
    } 
+6

Ваш ожидается обозначение является недействительным JSON. –

+0

Да, я использую его как переменную javascript. Таким образом, недопустимый JSON не является проблемой. – Martinez

+1

Итак, ваш вопрос связан с тем, как генерировать javascript, а не сериализовать на json ... Этот вопрос может быть интересным для вас [Функции анализа, хранящиеся как строки в объектном литерале/синтаксис JSON и различающиеся] (http://stackoverflow.com/questions/16767431/parsing-functions-stored-as-strings-in-object-literal-json-syntax-and-differetia) – t3chb0t

ответ

0

JSON - это формат сериализации данных. Вы не должны ожидать, что формат сериализации будет сериализован для функций.

С другой стороны, имена собственности JSON окружены двойными квотами. Он по-прежнему действителен JavaScript, поскольку вы можете объявить литерал объекта с использованием нотации JSON (конечно, JSON обозначает JavaScript Object Notation ...!).

Если вы хотите использовать сериализатор JSON для вывода литерала объекта, содержащего функции и/или геттеры/сеттеры, вы не используете нужный инструмент. Или вы все еще можете использовать его и выполнять дальнейшие манипуляции строк/замены, чтобы получить то, что вы ожидаете, как вы уже сделали ...

1

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

<script> 
 
    var myThing = eval(@Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(dic, Formatting.Indented))); 
 
</script>

0

Просто простирающийся немного:

@Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(
    Model, 
    new Newtonsoft.Json.JsonSerializerSettings{ ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()} 
)); 

Определенно нет лучше всего выглядят на планете и, вероятно, не настолько оптимальны ... НО это будет препятствовать JSON, который следует за принятыми соглашениями об именах JSON из модели ASP.net MVC, которая следует за его собственными принятыми «стандартами» для соглашений об именах.

... 
public int FooBar { get; set; } 
public string SomeString { get; set; } 
... 

Выведет:

{"fooBar":1,"someString":"some value"} 
1

Действительно поздно этот вопрос ... но у меня был тот же, и понял это ... так вот как я сделал это с помощью настраиваемого конвертер, который обрабатывает определенный класс.

ОБЫЧНО ... вы должны быть очень осторожны, используя это. Выходной сигнал не JSON, скорее это объект буквального JavaScript. Кроме того, объявление функции не имеет встроенного экранирования, поэтому тривиально разбить общий синтаксис литерала. Наконец ... в зависимости от использования это может представлять собой гигантскую дыру в безопасности, позволяя выполнить ненадежный javascript в браузере пользователя.

Вот код:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var swc = new SomethingWithCode { 
         JustSomething = "hello", 
         FuncDeclaration = "function() { alert('here'); }" 
     }; 

     var serializer = new Newtonsoft.Json.JsonSerializer(); 
     serializer.Converters.Add(new FunctionJsonConverter()); 
     serializer.NullValueHandling = Newtonsoft.Json.NullValueHandling.Include; 

     using (var sw = new System.IO.StringWriter()) 
     { 
      using (var writer = new Newtonsoft.Json.JsonTextWriter(sw)) 
      { 
       serializer.Serialize(writer, swc); 
      } 

      Console.Write(sw.ToString()); 
     } 
    } 
} 

class SomethingWithCode 
{ 
    public string JustSomething { get; set; } 
    public JavaScriptFunctionDeclaration FuncDeclaration { get; set; } 
} 

class JavaScriptFunctionDeclaration 
{ 
    private string Code; 

    public static implicit operator JavaScriptFunctionDeclaration(string value) 
    { 
     return new JavaScriptFunctionDeclaration { Code = value }; 
    } 

    public override string ToString() 
    { 
     return this.Code; 
    } 
} 

class FunctionJsonConverter : Newtonsoft.Json.JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(JavaScriptFunctionDeclaration); 
    } 

    public override object ReadJson(Newtonsoft.Json.JsonReader reader, Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 

    public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer) 
    { 
     writer.WriteRawValue(value.ToString()); 
    } 
} 
Смежные вопросы