Выберите идеальное начальное значение CRC

У меня была такая же проблема, поэтому я написал это сам. Это решение отличается от других ответов, поскольку оно может десериализоваться на нескольких уровнях.

Просто отправьте строку JSON в функцию deserializeToDictionary , она вернет не строго типизированный объект Dictionary<string, object> .

Старый код

private Dictionary<string, object> deserializeToDictionary(string jo)
{
    var values = JsonConvert.DeserializeObject<Dictionary<string, object>>(jo);
    var values2 = new Dictionary<string, object>();
    foreach (KeyValuePair<string, object> d in values)
    {
        // if (d.Value.GetType().FullName.Contains("Newtonsoft.Json.Linq.JObject"))
        if (d.Value is JObject)
        {
            values2.Add(d.Key, deserializeToDictionary(d.Value.ToString()));
        }
        else
        {
            values2.Add(d.Key, d.Value);
        }
    }
    return values2;
}

Пример: Это вернет объект Dictionary<string, object> ответа JSON в Facebook.

Тест

private void button1_Click(object sender, EventArgs e)
{
    string responsestring = "{\"id\":\"721055828\",\"name\":\"Dasun Sameera Weerasinghe\",\"first_name\":\"Dasun\",\"middle_name\":\"Sameera\",\"last_name\":\"Weerasinghe\",\"username\":\"dasun\",\"gender\":\"male\",\"locale\":\"en_US\",  hometown: {id: \"108388329191258\", name: \"Moratuwa, Sri Lanka\",}}";
    Dictionary<string, object> values = deserializeToDictionary(responsestring);
}

Примечание: родной город далее deserilize в объект Dictionary<string, object>.

Update

Мой старый ответ отлично работает, если в строке JSON нет массива. Это еще один deserialize в List<object>, если элемент является массивом.

Просто отправьте строку JSON в функцию deserializeToDictionaryOrList , она вернет не строго типизированную Dictionary<string, object> или List<object> .

private static object deserializeToDictionaryOrList(string jo,bool isArray=false)
{
    if (!isArray)
    {
        isArray = jo.Substring(0, 1) == "[";
    }
    if (!isArray)
    {
        var values = JsonConvert.DeserializeObject<Dictionary<string, object>>(jo);
        var values2 = new Dictionary<string, object>();
        foreach (KeyValuePair<string, object> d in values)
        {
            if (d.Value is JObject)
            {
                values2.Add(d.Key, deserializeToDictionary(d.Value.ToString()));
            }
            else if (d.Value is JArray)
            {
                values2.Add(d.Key, deserializeToDictionary(d.Value.ToString(), true));
            }
            else
            {
                values2.Add(d.Key, d.Value);
            }
        }
        return values2;
    }else
    {
        var values = JsonConvert.DeserializeObject<List<object>>(jo);
        var values2 = new List<object>();
        foreach (var d in values)
        {
            if (d is JObject)
            {
                values2.Add(deserializeToDictionary(d.ToString()));
            }
            else if (d is JArray)
            {
                values2.Add(deserializeToDictionary(d.ToString(), true));
            }
            else
            {
                values2.Add(d);
            }
        }
        return values2;
    }
}
0
задан Silicomancer 1 March 2019 в 23:56
поделиться

1 ответ

Хотя CRC, инициализированный в ноль, не подвержен влиянию начальных нулей, если во время передачи какой-либо из этих ведущих нулей станет ненулевым из-за ошибки, он обнаружит ошибку. Чего он не поймает, так это укороченного сообщения, в котором некоторые ведущие нули удаляются из сообщения, что приводит к укороченному сообщению, что может быть проблемой, если нет отдельной проверки длины. Использование всех поймает такое сокращенное сообщение. Фактически любой ненулевой начальный CRC будет перехватывать сокращенное сообщение. Все просто удобно. Одним из вариантов является использование CRC, сгенерированного из короткого шаблона данных из всех, для начального значения, например, 16-битные биты, используемые в качестве данных для 16-битного CRC для генерации начального CRC (это будет константа, поэтому вычисляется заранее), что будет эквивалентно добавлению данных со всеми 1 битами и инициализации CRC равным 0.

0
ответ дан rcgldr 1 March 2019 в 23:56
поделиться
Другие вопросы по тегам:

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