2015-04-10 4 views
-1

Я пытаюсь написать строки в допустимом формате JSON с использованием C# в эффективном способе Что файл должен выглядеть следующим образом:значение формата как допустимый файл JSON в C#

[ 
    { 
    "uuid": "c92161ba-7571-3313-9b59-5c615d25251c", 
    "name": "thijmen321" 
    }, 
    { 
    "uuid": "3b90891d-e6fc-44cc-a1a8-e822378ec148", 
    "name": "TehGTypo" 
    }, 
    { 
    "uuid": "5f820c39-5883-4392-b174-3125ac05e38c", 
    "name": "CaptainSparklez" 
    } 
] 

У меня уже есть имена и UUID, но мне нужен способ записать их в файл. Я хочу сделать это один за другим, так, первый файл выглядит следующим образом:

[ 
    { 
    "uuid": "c92161ba-7571-3313-9b59-5c615d25251c", 
    "name": "thijmen321" 
    } 
] 

Тогда как это:

[ 
    { 
    "uuid": "c92161ba-7571-3313-9b59-5c615d25251c", 
    "name": "thijmen321" 
    }, 
    { 
    "uuid": "3b90891d-e6fc-44cc-a1a8-e822378ec148", 
    "name": "TehGTypo" 
    } 
] 

и т.д. Но, конечно, UUID, и названия разные, так как я могу сделать это эффективным способом без использования каких-либо API-интерфейсов и т. д.? Мой текущий (на самом деле неэффективен) код:

public void addToWhitelist() 
{ 
    if (String.IsNullOrEmpty(whitelistAddTextBox.Text)) return; 
    string player = String.Empty; 

    try 
    { 
     string url = String.Format("https://api.mojang.com/users/profiles/minecraft/{0}", whitelistAddTextBox.Text); 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(url)); 
     request.Credentials = CredentialCache.DefaultCredentials; 

     using (WebResponse response = request.GetResponse()) 
     using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
      player = reader.ReadToEnd(); 
    } 
    catch (WebException ex) 
    { 
     Extensions.ShowError("Cannot connect to http://api.mojang.com/! Check if you have a valid internet connection. Stacktrace: " + ex, MessageBoxIcon.Error); 
    } 
    catch (Exception ex) 
    { 
     Extensions.ShowError("An error occured! Stacktrace: " + ex, MessageBoxIcon.Error); 
    } 

    if (String.IsNullOrWhiteSpace(player)) { Extensions.ShowError("This player doesn't seem to exist.", MessageBoxIcon.Error); return; } 
    player = player.Replace(",\"legacy\":true", "") 
    .Replace("\"id", " \"uuid") 
    .Replace("\"name", " \"name") 
    .Replace(",", ",\n") 
    .Replace("{", " {\n") 
    .Replace("}", "\n },"); 

    File.WriteAllText(Program.programPath + @"\Servers\" + servers[currentIndex].Name + @"\whitelist.json", ""); 

    try 
    { 
     using (StreamWriter sw = File.AppendText(Program.programPath + @"\Servers\" + servers[currentIndex].Name + @"\whitelist.json")) 
     { 
      sw.WriteLine("["); 
      foreach (string s in File.ReadAllLines(Program.programPath + @"\Servers\" + servers[currentIndex].Name + @"\whitelist.json")) 
       if (s.Contains("[") || s.Contains("]") || s.Equals(Environment.NewLine)) continue; 
       else sw.WriteLine(s); 
      sw.WriteLine(player); 
      sw.WriteLine("]"); 

      whitelistListBox.Items.Add("\n" + whitelistAddTextBox.Text); 
     } 
    } 
    catch (Exception ex) { Extensions.ShowError("An error occured while update whitelist.json! Stacktrace: " + ex); } 
    whitelistAddTextBox.Clear(); 
} 
+3

Вы должны использовать реальный JSON Serializer, а не пытаться сделать это самостоятельно с завязками. – darthmaim

ответ

1

Recommand путь "Microsoft" является с контрактом данных и DataContractJsonSerializer .. смотрите здесь

https://msdn.microsoft.com/de-de/library/system.runtime.serialization.json.datacontractjsonserializer%28v=vs.110%29.aspx

пример контакта будет:

[DataContract] 
internal class Person 
{ 
    [DataMember] 
    internal string name; 

    [DataMember] 
    internal string Uuid ; 
} 

используется класс следующим образом (очевидно)

Person p = new Person(); 
p.name = "John"; 
p.Uuid = "3b90891d-e6fc-44cc-a1a8-e822378ec148"; 

и сериализовать его на примере контракта Serializer

MemoryStream stream1 = new MemoryStream(); 
    DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Person)); 
ser.WriteObject(stream1, p); 

показать serialzed данные:

stream1.Position = 0; 
    StreamReader sr = new StreamReader(stream1); 
    Console.WriteLine(sr.ReadToEnd()); 
1

Попробуйте json.net это сделает работу сериализации для вас: http://www.newtonsoft.com/json

+0

", так как я могу сделать это эффективным способом без использования каких-либо API и т. Д.?" – bramhaag

0

Я хотел бы использовать JSON Serializer как http://www.newtonsoft.com/json

Это позволит вам перевести свой uuid/name как класс, вместо того, чтобы разбираться самостоятельно

Так что-то вроде:

internal class UuidNamePair 
{ 
    string Uuid { get; set; } 
    string Name { get; set; } 
} 

Тогда при вызове этого, вы бы просто сделать что-то вроде этого:

List<UuidNamePair> lst = new List<UuidNamePair>(); 
lst.Add(new UuidNamePair() { Name = "thijmen321", Uuid = "c92161ba-7571-3313-9b59-5c615d25251c" }); 
lst.Add(new UuidNamePair() { Name = "TehGTypo", Uuid = "3b90891d-e6fc-44cc-a1a8-e822378ec148" }); 
string json = JsonConvert.SerializeObject(lst, Formatting.Indented); 
Console.WriteLine(json); 

Вместо Console.WriteLine, вы могли бы сделать вашу POST к веб-службе или же вы пытаетесь использовать это JSON.

 Смежные вопросы

  • Нет связанных вопросов^_^