2015-05-05 3 views
3

У меня есть небольшая проблема с .Net Json сериализации У меня есть класс withlist строк двутавровой нужно сериализовать его как атрибут, например:C# Json Список сериализация

оригинал:

class: 
kid{ 
    int age; 
    String name; 
    List[String] toys; 
} 

результат:

{ 
    "age":10, 
    "name": Jane, 
    "toys":["one", "two", "three"] 
} 

мне нужно

{ 
    "age":10, 
    "name": Jane, 
    "toy_1": "one", 
    "toy_2": "two", 
    "toy_3": "three" 
} 

Это из-за api. Есть ли способ, как это сделать?

+6

Это один * странный * API. – dcastro

+0

Вы можете использовать анонимный тип, который позволит вам выбрать каждую игрушку в качестве нового участника. Является ли количество игрушек одинаковым или переменным? – Zack

+0

однако он переменный. –

ответ

1

Как говорит dcastro, это странный API, и вы должны его изменить, если сможете принять массив. Если вы не можете, вы можете попробовать создать и анонимный тип, так что вы будете иметь что-то вроде этого:

public object GetSerializationObjectForKid(Kid kid) 
{ 
    return new 
    { 
     age = kid.age, 
     name = kid.name, 
     toy_1 = toys.ElementAtOrDefault(0), 
     toy_2 = toys.ElementAtOrDefault(1), 
     toy_3 = toys.ElementAtOrDefault(2) 
    } 
} 

Чем вы можете сериализовать этот новый анонимный объект.

0

Ниже приведен пример использования Anonymous Type для выбора членов и предоставления им имен в соответствии с требованиями api. В настоящее время предполагается, что всегда будут 3 «игрушки».

using System.Linq; 
using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Xml; 
using System.Web.Script.Serialization; 
namespace CommandLineProgram 
{ 
    public class DefaultProgram 
    { 
     public static void Main() 
     { 
      var kid1 = new kid() 
      { 
       age = 10, 
       name = "Jane", 
       toys = new List<String> 
       { 
        "one", 
        "two", 
        "three" 
       } 
      }; 

      var asdf = new 
      { 
       age = kid1.age, 
       name = kid1.name, 
       toy_1 = kid1.toys[0], 
       toy_2 = kid1.toys[1], 
       toy_3 = kid1.toys[2] 
      }; 

      JavaScriptSerializer ser = new JavaScriptSerializer(); 

      String serialized = ser.Serialize(asdf); 
      Console.WriteLine(serialized); 
     } 
    } 

    public class kid 
    { 
     public int age; 
     public String name; 
     public List<String> toys; 
    } 
} 

Производит этот выход

{ 
    "age" : 10, 
    "name" : "Jane", 
    "toy_1" : "one", 
    "toy_2" : "two", 
    "toy_3" : "three" 
} 
3

Вот динамическое решение, которое не предполагает количество игрушек:

public class kid 
    { 
     public int age; 
     public String name; 
     public List<String> toys; 

     public string ApiCustomView 
     { 
      get 
      { 
       Dictionary<string, string> result = new Dictionary<string, string>(); 
       result.Add("age", age.ToString()); 
       result.Add("name", name); 
       for (int ii = 0; ii < toys.Count; ii++) 
       { 
        result.Add(string.Format("toy_{0}", ii), toys[ii]); 
       } 
       return result.ToJSON(); 
      } 
     } 
    } 

использование:

static void Main(string[] args) 
    { 
     var k = new kid { age = 23, name = "Paolo", toys = new List<string>() }; 
     k.toys.Add("Pippo"); 
     k.toys.Add("Pluto"); 

     Console.WriteLine(k.ApiCustomView); 
     Console.ReadLine(); 
    } 

Он использует расширение вы можете найти здесь: How to create JSON string in C#

namespace ExtensionMethods 
{ 
    public static class JSONHelper 
    { 
     public static string ToJSON(this object obj) 
     { 
      JavaScriptSerializer serializer = new JavaScriptSerializer(); 
      return serializer.Serialize(obj); 
     } 

     public static string ToJSON(this object obj, int recursionDepth) 
     { 
      JavaScriptSerializer serializer = new JavaScriptSerializer(); 
      serializer.RecursionLimit = recursionDepth; 
      return serializer.Serialize(obj); 
     } 
    } 
} 
0

я ве нашел решение ... это не ясно, но это работает

   JObject data = JObject.Parse(JsonConvert.SerializeObject(exportAuc)); 

       int i = 0; 
       foreach(String file in exportAuc.pdf_ostatni){ 
        data.Add("pdf_ostatni_" + i.ToString(), file); 
        i++; 
       } 
       String output = data.ToString(); 
+0

Я думаю, что ответ Пауло намного яснее. Используете ли вы Json.NET или какую-либо другую библиотеку в этом ответе для классов JObject и JsonConvert? – Zack

+0

Паоло, пожалуйста :-) –

0

Вы можете создать динамический объект, добавив свойства, необходимые и затем сериализовать его

dynamic jsonData = new System.Dynamic.ExpandoObject(); 
jsonData.age = kid.age; 
jsonData.name = kid.name; 
for (int i = 0; i < kid.toys.Count; i++) 
     { 
      ((IDictionary<String, Object>)jsonData).Add(string.Format("toy_{0}", i), kid.toys[i]); 
     } 
Смежные вопросы