Как я могу разобрать этот JSON с .net? - PullRequest
1 голос
/ 08 октября 2009

как я могу превратить этот JSON в список объектов, которые имеют два свойства: «id» и «answer»?

[["9","3"],["8","4"],["7","4"],["6","5"],["5","6"],["4","4"],["3","4"]]

Ответы [ 7 ]

5 голосов
/ 08 октября 2009

Требуется ссылка на System.Web.Extensions сборку;

using System.Linq;
using System.Collections;
using System.Collections.Generic;
using System.Web.Script.Serialization;

class Program
{
    public class Test
    {
        public string Id { get; set; }
        public string Answer { get; set; }
    }

    static void Main(string[] args)
    {
        string data ="[[\"9\",\"3\"],[\"8\",\"4\"],[\"7\",\"4\"],[\"6\",\"5\"]]";
        List<Test> tests = 
            Array.ConvertAll<ArrayList, Test>(
                new JavaScriptSerializer()
                    .Deserialize<ArrayList>(data)
                        .OfType<ArrayList>().ToArray(), 
               (item) =>
               {
                   return new Test()
                   {
                       Id = (string)item[0],
                       Answer = (string) item[1]
                   };
               }).ToList();
    }
}

ROFL, HTH

5 голосов
/ 08 октября 2009

Я начал использовать JSON.NET - http://james.newtonking.com/pages/json-net.aspx. Это очень полная библиотека JSON, которая позволяет вам делать практически все.

2 голосов
/ 08 октября 2009

Есть 101 способ, но вот метод анализа строки .Net 2.0:

        Dictionary<int, int> jsonValues = new Dictionary<int, int>();

        string data = "[[\"9\",\"3\"],[\"8\",\"4\"],[\"7\",\"4\"],[\"6\",\"5\"],[\"5\",\"6\"],[\"4\",\"4\"],[\"3\",\"4\"]]";

        string[] items = data.Split(new string[]{"\"],[\""}, StringSplitOptions.RemoveEmptyEntries);

        foreach (string str in items)
        {
            string[] intVals = str
                .Replace("\"", "")
                .Replace("[", "")
                .Replace("[", "")
                .Replace("]", "").Split(',');

            jsonValues.Add(int.Parse(intVals[0]), int.Parse(intVals[1]));
        }

        // test print:
        foreach (KeyValuePair<int,int> kvp in jsonValues)
        {
            System.Diagnostics.Debug.WriteLine(
                "ID:" + kvp.Key + " val:" + kvp.Value );
        }

кстати. Поскольку вы извлекаете пары имя-значение, я просто использовал словарь int / int для хранения данных.

1 голос
/ 08 октября 2009

Я думаю, что самый простой путь к работе - следующий фрагмент кода:

using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Json;
using System.Text;

namespace JsonParser
{
    class Program
    {
        static void Main(string[] args)
        {
            string data = "[[\"9\",\"3\"],[\"8\",\"4\"],[\"7\",\"4\"],[\"6\",\"5\"],[\"5\",\"6\"],[\"4\",\"4\"],[\"3\",\"4\"]]";
            var stream = new MemoryStream(new ASCIIEncoding().GetBytes(data));
            var deserializer = new DataContractJsonSerializer(typeof(List<List<string>>));
            var result = (List<List<string>>)deserializer.ReadObject(stream);
        }
    }
}

Конечно, результат содержит «Список>», который является правильным типом вашей строки Json. Также вы должны не забыть добавить ссылки на следующие библиотеки:

  • System.Runtime.Serialization
  • System.ServiceModel.Web
1 голос
/ 08 октября 2009

очень буквальный ответ. Будет работать только для того формата, который вы указали, может пойти не так, если вы передадите ему неожиданные данные Возвращает KeyValuepair с каждой парой в нем.

        var val = "[[\"9\",\"3\"],[\"8\",\"4\"],[\"7\",\"4\"],[\"6\",\"5\"],[\"5\",\"6\"],[\"4\",\"4\"],[\"3\",\"4\"]]";

        var result = val.ToCharArray()
            .Where(itm => Char.IsDigit(itm))
            .Select((itm, index) => new {c = int.Parse(itm.ToString()),index = index + 1})
            .GroupBy(itm => itm.index % 2 == 0 ? itm.index - 1 : itm.index)
            .Select(itm => new KeyValuePair<int, int>(itm.ElementAt(0).c, itm.ElementAt(1).c));
0 голосов
/ 08 октября 2009

В Silverlight есть System.Json.dll, которая делает анализ JSON очень простым. Ходили разговоры о том, чтобы загрузить его в .NET4.0, но я не уверен, что это произошло.

В обычном .NET вы можете использовать DataContractJsonSerializer (используйте что-то вроде List> в качестве «типа»). Это работает в .NET3.0 и выше. Может быть не лучшим выбором для всех сценариев синтаксического анализа JSON (но будет работать для вашего).

0 голосов
/ 08 октября 2009

Вот решение с использованием RegEx

string data = "[[\"9\",\"3\"],[\"8\",\"4\"],[\"7\",\"4\"],[\"6\",\"5\"],[\"5\",\"6\"],[\"4\",\"4\"],[\"3\",\"4\"]]";

var pairs = (from Match m in Regex.Matches(data, "\"[0-9]\"\\,\"[0-9]\"") 
             select m.Value.Split(',')).ToDictionary(d => d[0], d => d[1]);

Добавлено: если вы хотите получить результирующие значения как int вместо строк, вы можете сделать это вместо

var pairs = (from Match m in Regex.Matches(data, "\"[0-9]\"\\,\"[0-9]\"") 
        select m.Value.Split(','))
       .ToDictionary(d => Int32.Parse(d[0].Replace("\"", "")), 
                     d => Int32.Parse(d[1].Replace("\"", "")));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...